我在实际工作中需要将一个存在alpha图层的Png图片经过正片叠底后,合成出一个新的渲染后图片,之后图片进行处理导出成jpg图片,这就需要剔除图片中的alpha通道,然而直接粗暴的剔除则会发生图片的正片叠底效果完全无用,变成了一大片图片糊在上面(因为透明内容丢失)
此时我参考了一篇这个文章,因为我核心的处理需求还是(透明底转换成白色底)
#利用Pillow进行处理-opencv同理
from PIL import Image
def alphabg2white_PIL(img):
img=img.convert('RGBA')
sp=img.size
width=sp[0]
height=sp[1]
print(sp)
for yh in range(height):
for xw in range(width):
dot=(xw,yh)
color_d=img.getpixel(dot)
if(color_d[3]==0):
color_d=(255,255,255,255)
img.putpixel(dot,color_d)
img.show()
return img
使用效果,的确能够把透明内容转换成白色内容,可是:【太】【卡】【了】!
运行效率极其低下
解剖一下代码的原理,无非就是遍历搜索(两层高度和长度的遍历)*(每一层内部的RGBA值得遍历),复杂度高到爆炸。
即时使用numpy进行优化(说明一下原理,