Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Opening PNG with PIL/Pillow

I'm trying to use PIL/Pillow in Python to open a PNG image. You'd think it'd be trivial, but the images are showing up corrupted.

Here's an example image:

I tried loading it and showing it, using Python 3.4 and Pillow 2.7.0:

$ python
Python 3.4.0 (v3.4.0:04f714765c13, Mar 16 2014, 19:25:23) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import PIL.Image
>>> image = PIL.Image.open(r'C:\Users\Administrator\Dropbox\Desktop\example.png')
>>> image.show()
>>>

What I get displayed is this:

Does anyone have any idea why that is and how to solve it? (The corruption happens not only when I show it, but also when I'll try to paste it into another image, which is my original need.)

like image 922
Ram Rachum Avatar asked Mar 17 '15 19:03

Ram Rachum


2 Answers

Image.show() writes the image as a BMP (on windows), then opens it with the viewer. Unfortunately the BMP writer doesn't preserve the alpha channel, so you're just viewing the RGB channels of the image.

like image 56
wiredfool Avatar answered Oct 19 '22 17:10

wiredfool


As @wiredfool says, the image is being converted to RGB before it's shown. Unfortunately that means the alpha channel is simply being dropped. You want to do your own conversion that mixes the image with a white background instead.

Image.composite(image, Image.new('RGB', image.size, 'white'), image).show()

The documentation for paste shows that it ignores the alpha channel as well. You need to specify the image in two places, one for the source and one for the mask.

base.paste(image, box, image)
like image 33
Mark Ransom Avatar answered Oct 19 '22 19:10

Mark Ransom