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 и ничто иное?

8
задан mcccclean 25 June 2010 в 01:06
поделиться

1 ответ

Первый пример ImagePalette модуля docs показывает, как прикрепить палитру к изображению, но это изображение уже должно быть в режиме "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()
2
ответ дан 5 December 2019 в 18:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: