安卓/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
网友评论