Skip to main content
 首页 » 编程设计

python之PIL : can't save the jpg pasted with a png

2025年05月04日14daizhj

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

请您参考如下方法:

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

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

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

im = im.convert("RGB")