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 通道的主要内容,如果未能解决你的问题,请参考以下文章