我正在尝试将Pillow==5.4.1
中的图像转换为JPEG。所以我用下面的代码:
from PIL import Image as PilImage
img = PilImage.open('energy.png')
img.convert('RGB').save('newimage.jpeg', 'jpeg')
某些图像工作正常,但是当我尝试使用此图像时:
我的结果如下:
好的,我有一个问题,当图像具有透明度时,背景会变成黑色。所以我研究并遵循以下代码:
PIL Convert PNG or GIF with Transparency to JPG without
from PIL import Image
im = Image.open("energy.png")
bg = Image.new("RGB", im.size, (255,255,255))
bg.paste(im,im)
bg.save("newimage.jpeg")
这对这张图片很好用:
背景变成白色,没问题,我可以用它生存。但是当我将此代码用于其他图像时:
In [28]: im = Image.open('444.png')
In [29]: bg = Image.new("RGB", im.size, (255,255,255))
In [30]: bg.paste(im,im)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-30-f36dbc2a3949> in <module>()
----> 1 bg.paste(im,im)
/home/developer/.virtualenvs/prisvo/local/lib/python2.7/site-packages/PIL/Image.pyc in paste(self, im, box, mask)
1455 if mask:
1456 mask.load()
-> 1457 self.im.paste(im, box, mask.im)
1458 else:
1459 self.im.paste(im, box)
ValueError: bad transparency mask
此错误与这两个图像出现:
这两个图像之一是png(不透明),另一个已经是jpeg,但是我需要接受jpg和png。因为我需要这样做:
img.convert('RGB').save(smallJpegThumbStr, 'jpeg', quality=75)
我需要紧凑。
所以我使用了(我认为)一个不好的实现:
try:
bg = PilImage.new("RGB", img.size, (255,255,255))
bg.paste(img,mask=img)
bg.convert('RGB').save(mediumJpegThumbStr, 'jpeg', quality=75)
except:
img.convert('RGB').save(mediumJpegThumbStr, 'jpeg', quality=75)
换句话说,当发生错误时,我转到另一个实现。我认为这是不对的。我的第一个想法是使用第一个实现(在Expect内部)来jpeg图像,第二个实现到png(在try中)。但是错误也会发生在png(对于某些图像)上。我不知道此命令bg.paste(im,im)
是否存在条件,或者是否存在检测此错误的方法:ValueError: bad transparency mask
,而无需使用try。
此命令帮助。但是:
bg.paste(im,mask=im.convert('L'))