美文网首页
关于Android/IOS对4通道图片拆分时边缘出现灰边的记录

关于Android/IOS对4通道图片拆分时边缘出现灰边的记录

作者: 愤愤的有痣青年 | 来源:发表于2020-11-13 16:28 被阅读0次

    安卓/IOS使用常用的图片处理工具,将获得的4通道图片拆分为一张三通道图和一张Alpha图,结果得到的图在边缘过渡地带出现灰色的边,此边在白色背景下较为明显.
    如下图:


    原图

    使用如下伪代码拆分(其中image_bytes为原图二进制数据)

    rgb_image_bytes = []; # R G B通道图片
    mask_image_bytes = []; # 遮罩图片
    image_size = image_bytes.length/4; #单通道图的长度
    for(int i=0, i<image_size , i++){
            rgb_image_bytes [i] = image_bytes[i*4];
            rgb_image_bytes [i+1] = image_bytes[i*4+1];
            rgb_image_bytes [i+2] = image_bytes[i*4+2];
            mask_image_bytes [i] = image_bytes[i*4+3];
    }
    # 再将拆分的图,进行合成
    image = merge(rgb_image_bytes ,mask_image_bytes  );
    image.show();
    
    合成后的结果图

    这个问题的原因在于,安卓/IOS的图片处理库在将4通道的图片转为数组时,对于rgb通道的图与遮罩图做了一步运算,运算公式为rgb = rgba.rgb*rgba.a/255,要解决这个问题,就需要在拆分时将数据反向操作回来.

    rgb_image_bytes = []; # R G B通道图片
    mask_image_bytes = []; # 遮罩图片
    image_size = image_bytes.length/4; #单通道图的长度
    for(int i=0, i<image_size , i++){
            mask_image_bytes [i] = image_bytes[i*4+3];
            alpha_scale = mask_image_bytes [i]/255;
    
            rgb_image_bytes [i] = image_bytes[i*4]/alpha_scale ? alpha_scale !=0:0 ;
            rgb_image_bytes [i+1] = image_bytes[i*4+1]/alpha_scale ? alpha_scale !=0:0 ;
            rgb_image_bytes [i+2] = image_bytes[i*4+2]/alpha_scale ? alpha_scale !=0:0 ;
            
    }
    # 再将拆分的图,进行合成
    image = merge(rgb_image_bytes ,mask_image_bytes  );
    image.show();
    

    最终结果就正常,拆分后的通道合成时,需要乘上alpha_scale

    相关文章

      网友评论

          本文标题:关于Android/IOS对4通道图片拆分时边缘出现灰边的记录

          本文链接:https://www.haomeiwen.com/subject/avtbbktx.html