BytesIO заменяет прозрачность в файлах PNG на черный фон - PullRequest
0 голосов
/ 11 декабря 2018

Я хочу сохранить прозрачный фон в моей переменной 'image'.

Если я записываю в файл, изображение выглядит нормально.Я имею в виду, что изображение имеет прозрачный фон.

with urllib.request.urlopen(request) as response:
     imgdata = response.read()
     with open("temp_png_file.png", "wb") as output:
         output.write(imgdata)

Однако, если я сохраню данные изображения в BytesIO, прозрачный фон станет черным фоном.

with urllib.request.urlopen(request) as response:
     imgdata = response.read()
ioFile = io.BytesIO(imgdata) 
img = Image.open(ioFile)
img.show()

(Над фрагментом кода в строке img.show показано изображение с черным фоном.)

Как сохранить объект прозрачного изображения в переменной img?

1 Ответ

0 голосов
/ 11 декабря 2018

Две вещи ...


Во-первых, если вы хотите и ожидаете изображения RGBA при открытии файла с Pillow, лучше всего конвертировать все, что вы получите в это - иначе вы можетев итоге вы пытаетесь отобразить индексы палитры вместо значений RGB:

Так что измените это:

img = Image.open(ioFile)

на следующее:

img = Image.open(ioFile).convert('RGBA')

Во-вторых, OpenCV imshow() не может обрабатывать прозрачность, поэтому я склонен использовать метод Pillow * show().Как это:

from PIL import Image

# Do OpenCV stuff
...
...

# Now make OpenCV array into Pillow Image and display
Image.fromarray(numpyImage).show()
...