pil para libreria library from for python image png python-imaging-library transparent

python - para - ¿Cómo obtener el valor alfa de una imagen PNG con PIL?



pil python install (5)

¿Cómo detectar si una imagen PNG tiene un canal alfa transparente o no utiliza PIL?

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

Con el código anterior, sabemos si una imagen PNG no tiene canal alfa, pero ¿cómo obtener el valor alfa?

No encontré una clave de ''transparencia'' en el diccionario img.info como se describe en el sitio web de PIL

Estoy usando Ubuntu y zlib1g, los paquetes zlibc ya están instalados.


Intenté esto:

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

Esto devolvió el resultado que estaba esperando. Sin embargo, hice algunos cálculos para determinar la media y la desviación estándar, y los resultados salieron ligeramente diferentes de la función fx:mean de imagemagick.

¿Quizás la conversión cambió algunos de los valores? No estoy seguro, pero parece relativamente trivial.


Para obtener la capa alfa de una imagen RGBA, todo lo que necesita hacer es:

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

o

alpha = img.split()[-1]

Y hay un método para establecer la capa alfa:

img.putalpha(alpha)

La clave de transparencia solo se utiliza para definir el índice de transparencia en el modo de paleta (P). Si también desea cubrir el caso de transparencia del modo de paleta y cubrir todos los casos, puede hacer esto

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

Nota: el método de conversión es necesario cuando image.mode es LA, debido a un error en PIL.


Puede obtener los datos alfa de toda la imagen de una sola vez convirtiendo la imagen en cadena con el modo ''A''; por ejemplo, este ejemplo obtiene los datos alfa de la imagen y los guarda como imagen en escala de grises :)

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


img.info se trata de la imagen en su totalidad: el valor alfa en una imagen RGBA es por píxel, por lo que, por supuesto, no estará en img.info . El método getpixel del objeto de imagen, dada una coordenada como argumento, devuelve una tupla con los valores de (cuatro, en este caso) bandas para ese píxel: el último valor de la tupla será A, el valor alfa.


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