2009-12-26 4 views
18

Wie erkennt man, ob ein PNG-Bild einen transparenten Alphakanal hat oder PIL nicht verwendet?Wie bekomme ich den Alpha-Wert eines PNG-Bildes mit PIL?

Mit dem oben genannten Code wissen wir, ob ein PNG-Bild Alphakanal hat nicht, aber wie bekommt man den Alpha-Wert?

ich nicht eine ‚Transparenz‘ Schlüssel in img.info Wörterbuch bei PIL's website

wie beschrieben gefunden, ich bin mit Ubuntu und zlib1g werden zlibc Pakete bereits installiert.

Antwort

42

Um die Alpha-Schicht eines RGBA Bild alles, was Sie tun müssen, um zu bekommen ist:

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

oder

alpha = img.split()[-1] 

Und es gibt eine Methode, um die Alpha-Ebene zu setzen:

img.putalpha(alpha) 

Der Transparenzschlüssel wird nur zum Definieren verwendet e den Transparenzindex im Palettenmodus (P). Wenn Sie möchten, als auch die Palette Modus Transparenz Fall abzudecken und alle Fälle abdecken Sie diesen

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

Hinweis tun könnten: Das Konvertit Verfahren ist erforderlich, wenn die image.mode LA ist, aufgrund eines Fehlers in PIL.

2

Die img.info ist über das Bild als Ganzes - der Alpha-Wert in einem RGBA-Bild ist pro Pixel, so wird es natürlich nicht in img.info sein. Die getpixel Methode des Bildobjekts gibt bei einer Koordinate als Argument ein Tupel mit den Werten der (in diesem Fall vier) Bänder für dieses Pixel zurück - der letzte Wert des Tupels ist dann A, der Alpha-Wert.

+0

@Alex, vielen Dank für Ihre Antwort, gibt es eine Möglichkeit festzustellen, ob ein PNG-Bild einen transparenten Hintergrund hat? – jack

+2

Wenn Sie dies nicht selten tun, wird 'getpixel' sehr langsam. Sie sollten 'getdata' oder' load' für den High-Performance-Zugriff verwenden. – 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

Sie können in einem Rutsch die Alphadaten aus gesamtem Bild erhalten, indem auf String mit ‚A‘ Modus zB diesem Beispiel erhalten Alphadaten aus Bild und speichern es als Graustufenbild konvertiert Bild :)

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

ich versuchte dies:

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

Dies ist das Ergebnis zurück, die ich erwartet hatte. Allerdings habe ich eine Berechnung durchgeführt, um den Mittelwert und die Standardabweichung zu bestimmen, und die Ergebnisse unterschieden sich ein wenig von der fx:mean Funktion von imagemagick.

Vielleicht hat die Konvertierung einige der Werte geändert? Ich bin unsicher, aber es scheint relativ trivial.

+0

Sie haben dies versucht, damit es die Frage beantwortet, oder Sie haben ein ähnliches Problem, aber dieser Code funktioniert nicht wie erwartet? In letzterem Fall sollte dies eine neue Frage sein. Im ersten Fall könnte eine Bearbeitung weniger verwirrend sein. – rene

+0

Oh danke für die Klarstellung. Ich habe das versucht und etwas hinzugefügt, um zu bekommen, was ich brauchte.Es war ein ähnlicher Fall, und letzteres war eine neue Frage, aber ich gehe jetzt mit einem anderen Ansatz vor, da PIL anscheinend ein Problem mit Bildern hat, die sich im Modus "P" befinden. –