Python Pillow v2.6.0如何给256色调色板PNG图片添加Alpha通道?

8

我有一个numpy数组,它被写入一张图像,然后添加了一个RGB颜色映射作为调色板。现在需要在顶部添加一个透明通道(256个值)。我已经尝试将其转换为RGBA、LA等方式,但我无法想出如何将这个多值通道作为调色板添加在顶部。

这里有一个示例,它添加了一个单值透明通道:

# data = numpy array 1624x3856
im = Image.fromarray(data)
im = im.convert('P')
# cmap is a 768-valued RGB array
im.putpalette(my_cmap)
im.save('filename.png', transparency=0)

我要保存的频道如下所示:
# len(alpha) = 256
alpha = [0,255,255,255...255,255,255]

非常感谢您的帮助。


print data.shape 显示什么? - user3666197
print data.shape 输出 (1624, 3856)以及print im.size 输出 (3856, 1624) - monkcoder
Numpy数组用于RGBA模式应该包含(4x8位像素,[R,G,B]-真彩色和透明度掩码)。你的代码哪里出了问题? - user3666197
这段代码可以运行,但是每次我尝试在图像上放置一个 alpha 通道时,它都不喜欢我。当我按照上述方式保存图像时,它具有单值 alpha 通道 [0],而不是我想要保存的 [0,255,255,255,...]。 - monkcoder
那正是昨天在答案中发布的。 - user3666197
显示剩余2条评论
2个回答

6
以下是一个简单的示例,演示如何确保Pillow图像为RGBA格式:
img = Image.open("SOME_RGB_IMAGE.png")

if img.mode == "RGB":
    a_channel = Image.new('L', img.size, 255)   # 'L' 8-bit pixels, black and white
    img.putalpha(a_channel)

4

为使用Alpha通道准备正确的RGBA格式

在准备RGB部分后(从上面的data.shape可以看出),您的光栅图像将需要相应的Alpha层。

为此,请添加对实例方法的调用:

Image.putalpha(anAlphaLAYER)

这将添加/替换图像中的alpha层。如果图像没有alpha层,则会转换为LARGBA,因此请在调用此方法之前准备好RGB部分。新的层(anAlphaLAYER)必须是L1

因此,请确保anAlphaLAYER.shape与您的im.size(X,Y)匹配。另一种可能性是从整数值创建alpha层并按需修改其单元格值。

如果在numpy.array中早期完成了完整的RGBA格式,则整个问题将不会给您带来任何麻烦。


1
那么,你的意思是 Image.new('L', im.size, 255) 吗?我已经测试过它的大小,和原始图像是一样的。 - monkcoder
你是什么意思 _在numpy.array中早期完成了完整的RGBA格式_? - monkcoder
在numpy中尽早使用RGBA格式反映了最快的实践/方法,即直接在numpy数组(1624, 3856, 4)中操作[R,G,B]+[A]层,而不是较慢的PIL/Pillow逐像素模式,最后才转换/保存为所请求的文件格式。所有计算机视觉工具和实用程序都是这样工作的。 - user3666197
啊,我可以使用fromarray方法创建一张图像,然后转换为'P'类型并保存吗?我不需要使用putpalette方法或者transparency=0参数,仍然能保留调色板的PNG格式图像,并且所有通道都完整无缺? - monkcoder
或者您可以使用OpenCV2工具以更快的速度完成相同的任务。 - user3666197
我会尝试第二种方法并让您知道。目前也在审核putalpha方法,尽管我不得不进行修改,因为Alpha层不是单值图像(即,我必须在想要的地方制作0)。 - monkcoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接