PIL:将RGB图像转换为特定的8位调色板?

12

使用Python Imaging Library,我可以调用

img.convert("P", palette=Image.ADAPTIVE)
或。
img.convert("P", palette=Image.WEB)

但是否有一种方法可以转换为任意调色板?

p = []
for i in range(0, 256):
    p.append(i, 0, 0)
img.convert("P", palette=p)

它是否会将每个像素映射到图像中找到的最接近的颜色?或者这仅适用于Image.WEB而不适用于其他内容?

2个回答

9

在查看convert()的源代码时,我发现它引用了im.quantizequantize函数可以接受调色板参数。如果您提供带有调色板的图像,此函数将使用该调色板并将其应用于图像。

示例:

    src = Image.open("sourcefilewithpalette.bmp")
    new = Image.open("unconvertednew24bit.bmp")
    converted = new.quantize(palette=src)
    converted.save("converted.bmp")

另一个提供的答案对我没有用(它做了一些非常糟糕的双调色板转换或类似的东西),但这个解决方案有效。

3

ImagePalette 模块文档 的第一个示例展示了如何将调色板附加到图像,但该图像必须已经是"P""L"模式。但是,可以根据需要将完整的RGB图像转换为所需的调色板,方法如下:

from __future__ import division
import Image

palette = []
levels = 8
stepsize = 256 // levels
for i in range(256):
    v = i // stepsize * stepsize
    palette.extend((v, v, v))

assert len(palette) == 768

original_path = 'original.jpg'
original = Image.open(original_path)
converted = Image.new('P', original.size)
converted.putpalette(palette)
converted.paste(original, (0, 0))
converted.show()

你测试过这个吗? - Edward Falk
我相当确定我在那时候做过(大约5年前)。它对你没用吗? - Mike Boers
1
我没有尝试。我最终使用了im.quantize()。 - Edward Falk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接