如何使用PIL获取PNG图像的alpha值?

时间:2009-12-26 07:15:37

标签: python image png python-imaging-library transparent

如何使用PIL检测PNG图像是否具有透明Alpha通道?

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

使用上面的代码我们知道PNG图像是否具有alpha通道而不是如何获得alpha值?

我没有在PIL's website

中描述的img.info字典中找到'透明度'键

我正在使用Ubuntu和zlib1g,已经安装了zlibc软件包。

5 个答案:

答案 0 :(得分:47)

要获取RGBA图像的alpha图层,您只需:

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

alpha = img.split()[-1]

还有一种设置alpha图层的方法:

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时,需要使用convert方法,因为PIL中存在错误。

答案 1 :(得分:5)

您可以通过将图像转换为带有“A”模式的字符串,一次性从整个图像中获取alpha数据,例如,此示例从图像中获取alpha数据并将其另存为灰度图像:)

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

答案 2 :(得分:4)

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

答案 3 :(得分:2)

img.info是关于图像的整体 - RGBA图像中的alpha值是按像素的,所以当然它不会在img.info中。给定坐标作为参数的图像对象的getpixel方法返回一个元组,其中包含该像素的(在这种情况下为四个)带的值 - 元组的最后一个值将是A,即alpha值。

答案 4 :(得分:1)

我试过了:

fx:mean

这返回了我期待的结果。但是,我做了一些计算以确定平均值和标准偏差,结果与imagemagick的waveArray.removeAt... 函数略有不同。

也许转换改变了一些价值观?我不确定,但似乎相对微不足道。