【问题标题】:PIL: can't save the jpg pasted with a pngPIL:无法保存用png粘贴的jpg
【发布时间】:2018-01-15 10:20:46
【问题描述】:

我正在尝试将 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 倍。这么大的图我接受不了。

【问题讨论】:

  • 看看this answer
  • 错误信息告诉你问题出在哪里:JPEG 文件格式不能包含 alpha 通道。先转成RGB。

标签: python png jpeg python-imaging-library


【解决方案1】:

您正在尝试以 JPEG 格式保存 RGBA 图像,该格式不支持透明度(RGBA 中的 A 代表 Alpha 通道)。

当您将其保存为 PNG 时它会起作用,因为该格式支持透明度,但文件大小往往会更大,因为 PNG 不像 JPEG 那样压缩图像数据。

如果要将 PIL 图像保存为 JPEG,如果透明度对您不重要,则需要先将其转换为 RGB。这可以按如下方式完成:

im = im.convert("RGB")

【讨论】:

  • 所以我有两个选择:1)失去透明度; 2)用png保持透明度。我说的对吗?
  • @Yves 就我对 PIL 的(有限)经验而言,我认为这是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多