PIL图像模式"P"->"RGBA"

17

这是我的问题:

import Image
im = Image.open("1.png")
im.show()
print im.mode
im.convert("RGBA").save("2.png")

我的图片可以看出区别。我的问题是:我如何正确转换?

图像:original

结果:result

注意:原始图片有半透明的光晕,结果有一个实心的绿色 "光晕"。


你能解释一下问题是什么吗? - mwcz
你并没有说明差异在哪里。你所包含的图片是之前还是之后的? - Andrew Cox
测试过了,没有看到任何区别。你使用的是哪个Python和PIL版本? - Nicolas Barbey
1
请查看这个问答。请阅读两个答案及其评论! - Junuxx
1
@mDroidd:值得一提的是,实际上生成的RGBA图像确实具有透明度层,该层在与调色板图像中完全相同的像素上设置为透明。换句话说,调色板图像中的“发光”像素根本没有标记为透明 - 这就是我认为它们不在RGBA结果中的原因。我还注意到,只有在浏览器中查看图像时才会看到发光效果,而在我通常使用的图像编辑器(Photoshop)中则看不到。这毫无意义,我正在努力弄清楚发生了什么以及为什么。 - martineau
显示剩余5条评论
4个回答

9

5

很抱歉,你的PNG图像是一种PIL无法处理的类型——带有Alpha通道的调色板图像。当你打开这个图像时,Alpha通道会被丢弃,没有办法恢复。

这与通常的调色板透明度不同,通常使用调色板中的一个索引来表示完全透明的像素。


相关查找位置:PngImagePlugin tRNS loader,其中它只读取1个字节而不是alpha块,以及PNG tRNS规范显示应该读取一个块,而不是单个值。 - jterrace

2
你可以使用 scipy.misc.imread
img = scipy.misc.imread(filename, mode='RGBA')
img = Image.fromarray(img)

我认为这个功能最近在scipy中被弃用了,而且没有替代品。我现在正在度假,使用手机,所以很难为我检查。 - Martin Thoma

0

你的问题在于没有提供PIL应该使用什么作为ALPHA通道的来源信息。

PIL本身不会为图像添加透明度。

你想要哪部分图像是透明的?


在原始“P”图像中透明和/或半透明的部分:P,并且还要进行自动检测,因为这不是我需要转换的唯一图像... - mDroidd
抱歉,对我来说这两张图片看起来完全一样。您能在第三张图片上用红色标出应该透明的部分吗? - przemo_li

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