PIL:无法保存与png粘贴的jpg

5
我正在尝试将一个png粘贴到jpg上。以下是代码:
#!/usr/bin/env python3

from PIL import Image
from PIL import ImageDraw

im = Image.open("existing.jpg")
logo = Image.open("python-32.png")

back = Image.new('RGBA', im.size)
back.paste(im)
poly = Image.new('RGBA', (512,512))
pdraw = ImageDraw.Draw(poly)
pdraw.polygon([(128,128),(384,384),(128,384),(384,128)],
          fill=(255,255,255,127),outline=(255,255,255,255))

back.paste(poly, (0,0), mask=poly)
back.paste(logo, (im.size[0]-logo.size[0], im.size[1]-logo.size[1]), mask=logo)

back.show()

当我执行以上代码时,我可以看到显示了一个PNG图像,名称随机,例如tmpc8rb455z.PNG
我还试着以jpg格式保存,但失败了。也就是说,当我添加 back.save('res.jpg', 'JPEG') 并执行它时,我会得到一个错误:
Traceback (most recent call last):
  File "test.py", line 32, in <module>
    back.save('res.jpg', 'JPEG')
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/PIL/Image.py", line 1893, in save
    save_handler(self, fp, filename)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/PIL/JpegImagePlugin.py", line 604, in _save
    raise IOError("cannot write mode %s as JPEG" % im.mode)
OSError: cannot write mode RGBA as JPEG

然后我尝试将其保存为PNG格式:
back.save('res.png')

它可以工作,但是res.png的大小比existing.jpg大5倍。我无法接受这样一个巨大的图像。


请查看此答案 - Azat Ibrakov
错误信息告诉您问题所在:JPEG文件格式不能包含Alpha通道。请先将其转换为RGB。 - kindall
1个回答

14
你试图将RGBA图像保存为JPEG格式,但JPEG不支持透明度(RGBA中的A代表Alpha通道)。
当你将其保存为PNG时就能运行,因为该格式支持透明度,但文件大小往往会更大,因为PNG不能像JPEG那样压缩图像数据。
如果你想将PIL图像保存为JPEG,如果透明度对你不重要,就需要先将其转换为RGB。可以按照以下方式完成: im = im.convert("RGB")

所以我有两个选择:1)失去透明度;2)使用png保持透明度。我是对的吗? - Yves
@Yves 我相信这是正确的,就我(有限的)使用PIL的经验而言。 - JoshuaRLi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接