pillow 处理图像的一个坑

5,029 阅读1分钟

问题

在使用 pillow 给图片加 logo 的时候,遇到了 ValueError: images do not match 的问题。

代码如下:

from PIL import Image

def sign_img(img_obj, logo_img_obj):
    final_img = Image.new("RGBA", img_obj.size, None)
    final_img.paste(img_obj)
    
    logo_img_box = 0, 0
    final_img.alpha_composite(logo_img_obj, logo_img_box)
    
    return final_img
    
if __name__ == 'main':
    test_img = Image.open('test.png')
    logo_52 = Image.open('logo_52.png')
    logo_104 = Image.open('logo_104.png')
    
    sign_52 = sign_img(test_img, logo_52)
    sign_104 = sign_img(test_img, logo_104)

执行的时候报 ValueError: images do not match,看行数是在

final_img.alpha_composite(logo_img_obj, logo_img_box)

使用不同的 logo 的图片时,有的会报错,有的不会,怀疑是图片格式的问题。使用 file 命令查看得到如下结果,果然是不一样。

logo_52.png:  PNG image data, 52 x 52, 8-bit/color RGBA, non-interlaced
logo_104.png: PNG image data, 104 x 104, 8-bit colormap, non-interlaced

回到 Python 这边,把加载的图片对象打印出来

print(logo_52)
print(logo_104)

logo_52.png的结果:

<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=52x52 at 0x28C4B70>

logo_104.png 的结果

<PIL.PngImagePlugin.PngImageFile image mode=P size=208x208 at 0x2845B50>

模式不一样,看来这就是问题了。这里吐槽一下 pillow 的这个关于这个错误说明太少了,Google 出来都是与大小相关的,看着我一脸蒙蔽。

解决方案

  • Photoshop

photoshop 打开模式不一样的图片,然后点击 图像->模式->RGB颜色,保存即可。

  • Pillow 转换

图片对象有个 convert 的方法,直接用这个转换就好了

签名如下:

Image.convert(mode=None, matrix=None, dither=None, palette=0, colors=256)

样例:

new_img = old_img.convert('RGBA')
print(new_img.mode)     # -> 'RGBA'

# do something with new_img

点击查看用法