Подтвердить что ты не робот

Как получить альфа-значение изображения PNG с PIL?

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

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

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

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

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

4b9b3361

Ответ 1

Чтобы получить альфа-слой изображения 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]

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

Ответ 2

Вы можете получить альфа-данные из целого изображения за один раз, преобразуя изображение в строку с режимом "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")

Ответ 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

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

Ответ 5

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

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

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

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