Pil: конвертировать изображение RGB на определенную 8-битное палитру?
Вопрос
Используя библиотеку визуализации Python, я могу позвонить
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
и ничего больше?
Решение
Просмотр исходного кода convert()
Я видел это ссылки на это im.quantize
.
quantize
может взять аргумент палитры. Если вы предоставляете изображение, которое имеет палитру, эта функция возьмет эту палитру и применим ее к изображению.
Пример:
src = Image.open("sourcefilewithpalette.bmp")
new = Image.open("unconvertednew24bit.bmp")
converted = new.quantize(palette=src)
converted.save("converted.bmp")
Другой предоставленный ответ не работал для меня (он сделал некоторую плохую конверсию двойной палитры или что-то в этом роде), но это решение делало.
Другие советы
То 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()