Я пытаюсь конвертировать изображения в Pillow==5.4.1
в JPEG.Поэтому я использую следующий код:
from PIL import Image as PilImage
img = PilImage.open('energy.png')
img.convert('RGB').save('newimage.jpeg', 'jpeg')
Некоторые изображения работают нормально, но когда я пытаюсь это изображение:
Мой результат следующий:
ОК, у меня проблема, когда изображение имеет прозрачность, фон становится черным.Поэтому я исследую и следую этому коду:
PIL Конвертировать PNG или GIF с прозрачностью в JPG без
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)
В другихсловами, когда возникает ошибка, я иду в другую реализацию.Я думаю, что это не правильно.Моя первая идея состоит в том, чтобы использовать первую реализацию (внутри ожидаемого) для изображений в формате JPEG, а вторую реализацию для png (внутри попробовать).Но ошибка также происходит с PNG (для некоторых изображений).Я не знаю, есть ли условие для этой команды bg.paste(im,im)
, или если существует способ обнаружить эту ошибку: ValueError: bad transparency mask
без использования try.
Эта команда help.Но:
bg.paste(im,mask=im.convert('L'))