问题
在使用 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