Как получить альфа-значение изображения PNG с PIL?
Как определить, имеет ли PNG-изображение прозрачный альфа-канал или не использует PIL?
img = Image.open('example.png', 'r')
has_alpha = img.mode == 'RGBA'
С помощью вышеописанного кода мы знаем, имеет ли PNG-изображение альфа-канал, но не как получить альфа-значение?
Я не нашел ключ "прозрачности" в словаре img.info, как описано на веб-сайт PIL
Я использую Ubuntu и zlib1g, пакеты zlibc уже установлены.
Ответы
Ответ 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
.
Возможно, преобразование изменило некоторые значения? Я не уверен, но кажется довольно тривиальным.