Как получить альфа-значение изображения PNG с PIL? - PullRequest
20 голосов
/ 26 декабря 2009

Как определить, имеет ли изображение PNG прозрачный альфа-канал или не использует PIL?

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

С помощью приведенного выше кода мы знаем, есть ли у PNG-изображения альфа-канал, но как получить альфа-значение?

Я не нашел ключ «прозрачности» в словаре img.info, как описано на сайте PIL

Я использую Ubuntu и zlib1g, пакеты zlibc уже установлены.

Ответы [ 5 ]

47 голосов
/ 26 декабря 2009

Чтобы получить альфа-слой изображения RGBA, все что вам нужно сделать:

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

или

alpha = img.split()[-1]

И есть способ установить альфа-слой:

img.putalpha(alpha)

Ключ прозрачности используется только для определения индекса прозрачности в режиме палитры (P). Если вы хотите охватить случай прозрачности режима палитры и охватить все случаи, вы можете сделать это

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

Примечание: метод convert необходим, когда для image.mode задан LA, из-за ошибки в PIL.

5 голосов
/ 26 декабря 2009

Вы можете получить альфа-данные из целого изображения за один раз, преобразовав изображение в строку в режиме 'A', например, в этом примере извлеките альфа-данные из изображения и сохраните его как изображение в оттенках серого:)

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")
4 голосов
/ 26 декабря 2009
# 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())
2 голосов
/ 26 декабря 2009

img.info относится к изображению в целом - альфа-значение в изображении RGBA является пиксельным, поэтому, конечно, оно не будет в img.info. Метод getpixel объекта изображения с заданной в качестве аргумента координатой возвращает кортеж со значениями (в данном случае четырех) для этого пикселя - последним значением кортежа будет A, значение альфа.

1 голос
/ 12 января 2017

Я пробовал это:

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

Это вернуло результат, который я ожидал. Тем не менее, я сделал некоторые вычисления, чтобы определить среднее и стандартное отклонение, и результаты оказались немного отличными от функции fx:mean imagemagick.

Возможно, преобразование изменило некоторые значения? Я не уверен, но это кажется относительно тривиальным.

...