我正在尝试在jpg上粘贴png。这是代码:
#!/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 倍。我无法接受如此巨大的形象。
您正在尝试以不支持透明度的 JPEG 格式保存 RGBA 图像(RGBA 中的 A 代表 Alpha 通道(。
当您将其另存为 PNG 时,它可以工作,因为该格式支持透明度,但文件大小往往更大,因为 PNG 不会像 JPEG 那样压缩图像数据。
如果要将 PIL 图像另存为 JPEG,则需要首先将其转换为 RGB,如果透明度对您来说并不重要。这可以按如下方式完成:
im = im.convert("RGB")