Как определить, может ли изображение вставить фон? - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь конвертировать изображения в Pillow==5.4.1 в JPEG.Поэтому я использую следующий код:

from PIL import Image as PilImage
img = PilImage.open('energy.png')
img.convert('RGB').save('newimage.jpeg', 'jpeg')

Некоторые изображения работают нормально, но когда я пытаюсь это изображение:

enter image description here

Мой результат следующий:

enter image description here

ОК, у меня проблема, когда изображение имеет прозрачность, фон становится черным.Поэтому я исследую и следую этому коду:

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")

Это прекрасно работает для этой картинки:

enter image description here

Фон становится белым, нет проблем, я могу выжить с ним.Но когда я использую этот код для других изображений:

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

Эта ошибка возникает с этими двумя изображениями:

enter image description hereenter image description here

Одно из этих двух изображений - 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'))

enter image description here

...