Python PIL 完全删除每个 alpha 通道

Posted

技术标签:

【中文标题】Python PIL 完全删除每个 alpha 通道【英文标题】:Python PIL remove every alpha channel completely 【发布时间】:2019-11-10 22:24:57 【问题描述】:

我非常努力地将PNG转换为Bitmap,但每次都失败了。

但现在我想我可能找到了一个原因。 这是因为 Alpha 通道。 (Photoshop 中的“羽毛”)

输入图片:

我预期的输出:

当前输出:

我想将其转换为 8 位位图并将每个不可见(alpha)像素着色为紫色(#FF00FF)并将它们设置为点零。 (第一个调色板)

但显然,实际图像周围的背景区域和不可见区域具有不同的颜色。 我希望所有这些颜色都与背景相同。 我该怎么办?

这三个我都试过了

image = Image.open(file).convert('RGB')


image = Image.open(file)
image = image.convert('P')
pp = image.getpalette()
pp[0] = 255
pp[1] = 0
pp[2] = 255
image.putpalette(pp)


image = Image.open('feather.png')
result = image.quantize(colors=256, method=2)

第三种方法看起来更好,但是当我将它保存为位图时,它变得一样了。

我现在只想结束它。我在这上面浪费了太多时间。

如果我从输出文件中删除背景, 看起来还是很别扭。

【问题讨论】:

期望的输出图像和问题图像是相同的(至少在视觉层面上)。那么问题出在哪里? @VasuDeo.S 是的,在视觉层面上它是相同的,但蓝色周围的颜色不是#FF00FF。它们就像#FC01FF #FF08FF 等等……它们只是相似的颜色,不完全是#FF00FF 你想将图片保存为.bmp扩展名吗? @VasuDeo.S 是的。这就是为什么用特定颜色着色背景很重要。将背景区域和图像区域分开 【参考方案1】:

正如你所说,你的问题有点误导:-

我想将其转换为 8 位位图并将每个不可见(alpha)像素着色为紫色(#FF00FF)并将它们设置为点零。 (第一个调色板)

但在描述中,您提供了一个没有 Alpha 通道的输入图像。幸运的是,我看到了您之前的问题Convert PNG to 8 bit bitmap,因此我获得了包含 alpha 的图像(您在描述中提到)但没有发布。

这是带有 ALPHA 的图像:-

现在我们必须在P 模式下获取与此图像等效的.bmp

from PIL import Image

image = Image.open(r"Image_loc")

new_img = Image.new("RGB", (image.size[0],image.size[1]), (255, 0, 255))

cmp_img = Image.composite(image, new_img, image).quantize(colors=256, method=2)

cmp_img.save("Destination_path.bmp")

输出图像:-

【讨论】:

哦,现在越来越近了!现在我的程序可以读取输出文件并检测要隐藏的背景。但如果没有背景,它看起来仍然很不自然。 如果我的程序删除了背景颜色(#FF00FF),它看起来就像是一个阴暗的粉红色粘在蓝色周围。我至少可以给它们附近的颜色上色吗?看起来更自然.. @Bora 那么问题出在哪里?我在答案中所说的方法对您不起作用吗?因为它输出的图像中原始图像的任何非不透明像素的值为洋红色(#FF00FF)。 是的,但不完全......图像周围仍然存在不完全的洋红色。删除它们是我一直在问的每个问题的重点 @Bora 这样做的原因是,因为您的输入图像包含一系列 alpha 值。 I.E.它们存在的图像区域不是完全不透明或透明的,这意味着它们的 0

以上是关于Python PIL 完全删除每个 alpha 通道的主要内容,如果未能解决你的问题,请参考以下文章

PIL

Python PIL 0.5 不透明度、透明度、阿尔法

python PIL相关操作

python 图像处理

python PIL(pillow)图像处理-图片上添加文字

使用 PIL 查找像素的最大和最小 RGB 值