使用PIL打开带有调色板的图像,并使用相同的调色板保存该图像

时间:2016-08-31 16:07:49

标签: python image numpy bitmap python-imaging-library

所以我试图将bmp转换为NumPy数组,将数组存储在某处,然后将其转换回bmp图像。

bmp = Image.open(fn_bmp)
data = np.array(bmp.convert('P', palette=Image.WEB))

此数据暂时存储在另一个文件中,然后我会在稍后的某个时间检索它。

bmp = Image.fromarray(np.array(dataset).convert('P', palette=Image.WEB))
bmp.save(fn)

请注意,数据集是一个转换回NumPy数组的对象,np.array(dataset)==所有索引中的数据。

出于某种原因,当我显示或保存此结果图像时,对应于某些调色板颜色的“14”被解释为灰度值并保存这样的颜色。如何将图像保存为彩色调色板位图图像?我尝试添加保存选项(例如mode ='P',palette = Image.WEB)无济于事。谢谢你的帮助。

修改

在PIL文档的教程部分中,它指定了转换的限制。

  

该库支持每种支持模式与“L”和“RGB”模式之间的转换。要在其他模式之间进行转换,您可能必须使用中间图像(通常为“RGB”图像)。

所以,为了完成我正在做的事情,我必须在第一个数组中将图像转换为RGB,然后在第二个数组中转换回P..

然而,当从RGB转换回P时,图像(只有4种颜色)会变形。这有什么理由吗?

1 个答案:

答案 0 :(得分:0)

在这种情况下,Image.fromarray(data)会返回灰度图像。将此图像转换为其他图像模式时,它将保持灰度!

相反,您必须以调色板的形式提供颜色信息:

# first part
bmp = Image.open(fn_bmp)
bmp_P_web = bmp.convert('P', palette=Image.WEB)
web_palette = bmp_P_web.getpalette()  # <---
data = np.array(bmp_P_web)

# second part
bmp = Image.fromarray(data)
bmp.putpalette(web_palette)  # <---

不知道如何直接从PIL获取web_palette,但这里有一种用numpy生成it的方法:

web_palette = np.zeros(3*256, int)
web_palette[30:-90] = np.mgrid[0:256:51, 0:256:51, 0:256:51].ravel('F')