代码之家  ›  专栏  ›  技术社区  ›  Yves

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

  •  5
  • Yves  · 技术社区  · 7 年前


    #!/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
    


    back.save('res.png')

    它可以工作,但大小 res.png 大于5倍 existing.jpg

    1 回复  |  直到 7 年前
        1
  •  11
  •   JoshuaRLi    7 年前

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

    当您将其保存为PNG时,它可以工作,因为该格式支持透明度,但文件大小往往更大,因为PNG压缩的图像数据不如JPEG。

    im = im.convert("RGB")