Я новичок в Python и пытаюсь использовать PIL для выполнения задачи синтаксического анализа, которая мне нужна для проекта Arduino. Этот вопрос относится к методу Image.convert()
и параметрам цветовых палитр, дизеринга и т. Д.
У меня есть оборудование, способное отображать изображения только с 16 цветами за раз (но их можно указать триплеты RGB). Итак, я хотел бы автоматизировать задачу получения произвольного изображения PNG с истинным цветом, выбора «оптимальной» 16-цветной палитры для его представления и преобразования изображения в палитру, содержащую ТОЛЬКО 16 цветов.
Я хочу использовать дизеринг. Проблема в том, что метод image.convert()
выглядит немного странно. Его аргументы не полностью задокументированы (документация PIL для Image.convert ()), поэтому я не знаю, виновата ли я в этом или нет в методе ошибок.
Вот простая версия моего кода:
import Image
MyImageTrueColor = Image.new('RGB',100,100) # or whatever dimension...
# I paste some images from several other PNG files in using MyImageTrueColor.paste()
MyImageDithered = MyImageTrueColor.convert(mode='P',
colors=16,
dither=1
)
На основании некоторых поисков, которые я сделал (например: Как уменьшить цветовую палитру с помощью PIL) Я бы подумал, что этот метод должен делать то, что я хочу, но не повезло. Он размывает изображение, но дает изображение с более чем 16 цветами.
На всякий случай я удалил аргумент «дизеринг». Тот же результат.
Я повторно добавил аргумент «dither = 1» и добавил аргумент Image.ADAPTIVE (как показано в ссылке выше), чтобы посмотреть, что произошло. В результате получилось изображение, содержащее 16 цветов, но БЕЗ дизеринга.
Я что-то упустил? PIL глючит? Решение, которое я придумал, заключалось в том, чтобы выполнить 2 шага, но это кажется неряшливым и ненужным. Я хочу выяснить, как это сделать правильно :-) Для полноты, вот версия моего кода, которая дает правильный результат - но делает это небрежно. (На первом этапе получается размытое изображение с> 16 цветами, а на втором - изображение, содержащее только 16 цветов.)
MyImage_intermediate = MyImageTrueColor.convert(mode='P',
colors=16
)
MyImageDithered = MyImage_intermediate.convert(mode='P',
colors=16,
dither=1,
palette=Image.ADAPTIVE
)
Спасибо!