2009-12-26 4 views
18

Come rilevare se un'immagine PNG ha un canale alfa trasparente o non usa PIL?Come ottenere il valore alfa di un'immagine PNG con PIL?

img = Image.open('example.png', 'r') 
has_alpha = img.mode == 'RGBA' 

Con il codice di cui sopra sapere se un'immagine PNG canale alfa ha non meno, ma come ottenere il valore alfa?

non ho trovato una chiave di 'trasparenza' nel dizionario img.info come descritto PIL's website

sto usando Ubuntu e zlib1g, pacchetti zlibc sono già installati.

risposta

42

Per ottenere lo strato alfa di un'immagine RGBA tutto quello che dovete fare è:

red, green, blue, alpha = img.split() 

o

alpha = img.split()[-1] 

e c'è un metodo per impostare il livello di alfa:

img.putalpha(alpha) 

Il tasto trasparenza viene utilizzato solo per definire e l'indice di trasparenza nella modalità tavolozza (P). Se si vuole coprire il caso trasparenza palette dei modi come bene e coprire tutti i casi si potrebbe fare questo

if img.mode in ('RGBA', 'LA') or (img.mode == 'P' and 'transparency' in img.info): 
    alpha = img.convert('RGBA').split()[-1] 

Nota: è necessario il metodo Convert quando l'image.mode è Los Angeles, a causa di un bug nel PIL.

2

Il img.info riguarda l'immagine nel suo complesso - il valore alfa in un'immagine RGBA è per pixel, quindi ovviamente non sarà in img.info. Il metodo getpixel dell'oggetto immagine, data una coordinata come argomento, restituisce una tupla con i valori delle (quattro, in questo caso) bande per quel pixel - l'ultimo valore della tupla sarà quindi A, il valore alfa.

+0

@Alex, grazie per la risposta, c'è un modo per determinare se un'immagine PNG ha uno sfondo trasparente? – jack

+2

A meno che non si stia facendo raramente, 'getpixel' sarà molto lento. Dovresti usare 'getdata' o' load' per l'accesso ad alte prestazioni. – carl

3
# python 2.6+ 

import operator, itertools 

def get_alpha_channel(image): 
    "Return the alpha channel as a sequence of values" 

    # first, which band is the alpha channel? 
    try: 
     alpha_index= image.getbands().index('A') 
    except ValueError: 
     return None # no alpha channel, presumably 

    alpha_getter= operator.itemgetter(alpha_index) 
    return itertools.imap(alpha_getter, image.getdata()) 
4

È possibile ottenere i dati alfa di intera immagine in una volta sola convertendo un'immagine per stringa con modalità 'A' ad esempio questo esempio ottenere i dati alfa di immagine e lo salva immagine scala di grigi come :)

from PIL import Image 

imFile="white-arrow.png" 
im = Image.open(imFile, 'r') 
print im.mode == 'RGBA' 

rgbData = im.tostring("raw", "RGB") 
print len(rgbData) 
alphaData = im.tostring("raw", "A") 
print len(alphaData) 

alphaImage = Image.fromstring("L", im.size, alphaData) 
alphaImage.save(imFile+".alpha.png") 
1

ho provato questo:

from PIL import Image 
import operator, itertools 

def get_alpha_channel(image): 
    try: 
     alpha_index = image.getbands().index('A') 
    except ValueError: 
     # no alpha channel, so convert to RGBA 
     image = image.convert('RGBA') 
     alpha_index = image.getbands().index('A') 
    alpha_getter = operator.itemgetter(alpha_index) 
    return itertools.imap(alpha_getter, image.getdata()) 

questa restituito il risultato che mi aspettavo. Tuttavia, ho eseguito alcuni calcoli per determinare la media e la deviazione standard ei risultati sono risultati leggermente diversi dalla funzione fx:mean di imagemagick.

Forse la conversione ha modificato alcuni valori? Non sono sicuro, ma sembra relativamente banale.

+0

Hai provato questo in modo che risponda alla domanda o hai un problema simile ma questo codice non funziona come previsto? In quest'ultimo caso questa dovrebbe essere una nuova domanda. Nel primo caso potrebbe essere necessaria una modifica per essere meno confusi? – rene

+0

Oh grazie per il chiarimento. Ho provato questo e ho aggiunto qualcosa per ottenere ciò di cui avevo bisogno.Era qualcosa di simile, e quest'ultima era una nuova domanda, ma ora ho un approccio diverso perché sembra che il PIL abbia un problema con le immagini in modalità "P". –