Pil: конвертировать изображение RGB на определенную 8-битное палитру?

StackOverflow https://stackoverflow.com/questions/3114925

  •  29-09-2019
  •  | 
  •  

Вопрос

Используя библиотеку визуализации 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()
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top