2015-03-17 10 views
7

Ich versuche, PIL/Pillow in Python zu verwenden, um ein PNG-Bild zu öffnen. Sie würden denken, es wäre trivial, aber die Bilder sind beschädigt.Öffnen von PNG mit PIL/Pillow

Hier ist ein Beispiel Bild:

habe ich versucht, es zu laden und zeigt es, mit Python 3.4 und Kissen 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() 
>>> 

Was ich angezeigt bekommen, ist dies:

Hat jemand eine Idee warum das so ist und wie man es löst? (Die Korruption geschieht nicht nur, wenn ich es zeigen, aber auch, wenn ich werde versuchen, es in ein anderes Bild einfügen, die meine ursprünglichen Bedarf.)

Antwort

4

Wie @wiredfool says wird das Bild in RGB konvertiert, bevor es angezeigt wird. Leider bedeutet das, dass der Alpha-Kanal einfach fallen gelassen wird. Sie möchten eine eigene Konvertierung durchführen, bei der das Bild stattdessen mit einem weißen Hintergrund gemischt wird.

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

Die Dokumentation für paste zeigt, dass es den Alphakanal als auch ignoriert. Sie müssen das Bild an zwei Stellen angeben, eine für die Quelle und eine für die Maske.

base.paste(image, box, image) 
+0

Ich habe gesehen, dass das Bild nicht nur in '.show()' beschädigt wurde, sondern auch, wenn ich 'image.paste' daraus in ein anderes Bild verwandelte. Es wurde auf genau dieselbe Weise visuell verfälscht. –

+0

@RamRachum Wenn das Bild, in das Sie einfügen, nicht im Modus 'RGBA' ist, wandeln Sie es vor dem Einfügen um. –

+0

Das hat den Trick, danke! –

3

Image.show() schreibt das Bild als BMP (Windows), öffnet sich dann es mit dem Betrachter. Leider behält der BMP-Schreiber den Alphakanal nicht bei, so dass Sie nur die RGB-Kanäle des Bildes betrachten.

+0

Ich habe das Bild nicht nur in '.show()' beschädigt, sondern auch, wenn ich 'image.paste' davon in ein anderes Bild. Es wurde auf genau dieselbe Weise visuell verfälscht. –

+0

'Image.paste' hat eine seltsame API in Bezug auf Alpha. Wenn Sie eine Maske übergeben, wird diese verwendet, um auszuwählen, was in das Bild eingefügt wird. 'Image.alpha_composite' ist wahrscheinlich, was Sie wollen. – wiredfool