使用Python转换颜色格式?

时间:2009-07-13 14:24:42

标签: python

我正在使用Python工具将图像数据转换为这些颜色格式:

  • RGB565
  • RGBA5551
  • RGBA4444。

实现这一目标的最简单方法是什么?

我经常使用Python Imaging Library (PIL)。所以我知道如何加载图像并获得RGBA8888格式的每个像素值。我知道如何从那一点手动编写所有转换代码。

有更简单的方法吗? PIL可能是某种类型的'格式化程序'插件吗?

PIL是否已经支持我定位的某些格式?如果不挖掘所有的源代码,我无法弄清楚PIL真正支持的格式。

或者是否有比PIL更好的库来实现这一目标?

任何提示将不胜感激。谢谢!

5 个答案:

答案 0 :(得分:1)

将某些内容从8位改为5位是微不足道的。在8位中,该值在0到255之间,在5位中它在0到31之间,因此您需要做的就是将值除以8.或者在RGB565模式下为绿色的情况下为4。或者在RGBA4444模式下为16,因为它每通道使用4位等等。

编辑:再次阅读你的问题,我认为存在混淆(无论是我还是你)。 RGB555和RGBA4444等不是真正的格式,如GIF或JPG,它们是色彩空间。这种转变是微不足道的(见上文)。您想要在以后保存它的文件格式是另一个问题。大多数文件格式对色彩空间的支持有限。我认为例如JPEG总是将它保存在YCbCr中(但我可能会弄错),GIF使用调色板(我认为它总是RGB888)等。

答案 1 :(得分:1)

有一个名为Python Colormath的模块可以提供很多不同的转换。强烈推荐。

答案 2 :(得分:1)

Numpy确实很强大,但要到达那里并回到PIL需要两个内存副本。您是否尝试过以下方面的内容?

im = Image.open('yourimage.png')
im.putdata([yourfunction(r,g,b) for (r,g,b) in im.getdata()])

这非常快(特别是当你可以使用查找表时)。我不熟悉你提到的颜色空间,但据我所知,你知道转换,所以yourfunction(r,g,b)的实现应该是直截了当的。

同样im.convert('RGBA', matrix)可能非常强大,因为它通过提供的矩阵应用颜色转换非常快。但是我从来没有做过我想要它做的事情......: - /

答案 3 :(得分:1)

还有一个名为Grapefruit的模块,可让您在很多颜色格式之间进行转换。

答案 4 :(得分:0)

我最终手动完成了Lennart Regebro建议的转换。

然而,纯Python(迭代每个像素)结果太慢了。

我的最终解决方案使用PIL加载图片,numpy操作(转换)像素数组。