Pillow 将 png 转换为 8bit 位图

Posted

技术标签:

【中文标题】Pillow 将 png 转换为 8bit 位图【英文标题】:Pillow convert png to 8bit bitmap 【发布时间】:2019-11-10 00:14:52 【问题描述】:

我尝试将 8 位 PNG 转换为 8 位(256 索引调色板)位图图像, 但是枕头一直在吐,结果很糟糕。

这是我尝试过的。

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(file)
image = image.convert('P')
image.save(blabla.bmp)

这就是我期望看到的结果。 这是一个实际的位图(由 Photoshop 完成。) Photoshop 这就是枕头所做的: Pillow 这是什么玩笑?! 它甚至被剪掉了 我应该怎么做才能正确转换它?

原图:

【问题讨论】:

能否把原图贴出来,让我们测试一下? 哦,好的,谢谢 :) i.stack.imgur.com/G0g5q.png 【参考方案1】:

你可以这样做:

from PIL import Image

# Open image
image = Image.open('feather.png')

# Quantize to 256 colours using fast octree method
result = image.quantize(colors=256, method=2)

【讨论】:

@MarkSetchell 很好的答案 (+1) 顺便说一句,您能否解释一下 Image.quantize() 的工作方式有何不同,然后通过 convert("P") 将图像转换为 P 模式。其次,快速八叉树方法在这段代码中做了什么?我在quantize() 中运行了没有method = 2 参数的代码并得到了相同的结果。 @VasuDeo.S 您好 Vasu,对不起,我与 PIL 的作者没有联系,也没有了解他们为什么选择以任何特定方式做任何事情。我只是有一些使用 PIL/Pillow 的经验,这就是我学会获得最佳结果的方式。 我现在检查了你的方法,它只适用于 PNG,但是当我尝试保存为 'P' 类型位图时也会发生同样的问题。 我认为这是因为 Alpha 通道。 alpha 通道没有被顺利移除..

以上是关于Pillow 将 png 转换为 8bit 位图的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Pillow从图像创建位图而不保存图像?

将 Png 转换为 Bmp 和位图数组

将大型光栅图形图像(位图、PNG、JPEG 等)转换为非矢量 postscript

将位图 (bmp) 转换为具有透明度的 png (Windows c++)

使用 libpng 将位图缓冲区快速编码为 png

将位图(RGB_565)转换为灰度(8位)Android