如何使用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软件包。
答案 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...
函数略有不同。
也许转换改变了一些价值观?我不确定,但似乎相对微不足道。