2015-03-17 10 views
7

Sto cercando di utilizzare PIL/Pillow in Python per aprire un'immagine PNG. Penseresti che sarebbe banale, ma le immagini si stanno rivelando corrotte.Apertura PNG con PIL/Cuscino

Ecco un immagine di esempio:

ho provato a caricarlo e mostrarlo, utilizzando Python 3.4 e 2.7.0 cuscino:

$ 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() 
>>> 

ciò che ho visualizzato è questo:

Qualcuno ha qualche idea del perché e come risolverlo? (La corruzione accade non solo quando lo mostro, ma anche quando cercherò di incollarlo in un'altra immagine, che è la mia necessità originale.)

risposta

4

Come @wiredfool says, l'immagine viene convertita in RGB prima che venga visualizzata. Sfortunatamente ciò significa che il canale alfa viene semplicemente abbandonato. Vuoi fare la tua conversione che mescola invece l'immagine con uno sfondo bianco.

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

La documentazione per paste mostra che ignora il canale alfa pure. È necessario specificare l'immagine in due punti, uno per l'origine e uno per la maschera.

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

Ho visto l'immagine danneggiarsi non solo in '.show()' ma anche quando ne ho fatto il 'image.paste 'in un'altra immagine. È stato danneggiato esattamente nello stesso modo visivamente. –

+0

@RamRachum se l'immagine in cui stai incollando non è in modalità 'RGBA', quindi' convert' prima dell'incolla. –

+0

Questo ha fatto il trucco, grazie! –

3

Image.show() scrive l'immagine come un BMP (su Windows), quindi apre con lo spettatore. Sfortunatamente lo scrittore BMP non conserva il canale alfa, quindi stai solo visualizzando i canali RGB dell'immagine.

+0

Ho visto l'immagine danneggiarsi non solo in '.show()' ma anche quando ho fatto 'image.paste' di esso in un'altra immagine. È stato danneggiato esattamente nello stesso modo visivamente. –

+0

'Image.paste' ha una api strana rispetto all'alfa. Se passi una maschera, la userà per selezionare ciò che viene incollato nell'immagine. 'Image.alpha_composite' è probabilmente quello che vuoi. – wiredfool