使用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
支持{还是其他什么?
答案 0 :(得分:7)
在查看convert()
的源代码时,我看到它引用了im.quantize
。
quantize
可以采用调色板参数。如果您提供具有调色板的图像,则此功能将采用该调色板并将其应用于图像。
示例:
src = Image.open("sourcefilewithpalette.bmp")
new = Image.open("unconvertednew24bit.bmp")
converted = new.quantize(palette=src)
converted.save("converted.bmp")
另一个提供的答案对我不起作用(它做了一些非常糟糕的双调色板转换或其他东西,但是这个解决方案确实如此。
答案 1 :(得分:2)
ImagePalette
module docs's第一个示例显示了如何将调色板附加到图像,但该图像必须已处于模式"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()