Использование Python для преобразования цветовых форматов? - PullRequest
2 голосов
/ 13 июля 2009

Я работаю над инструментом Python для преобразования данных изображения в следующие цветовые форматы:

  • RGB565
  • RGBA5551
  • RGBA4444.

Какой самый простой способ добиться этого?

Я часто использовал Python Imaging Library (PIL) . Итак, я знаю, как загрузить изображение и получить значение каждого пикселя в формате RGBA8888. И я знаю, как написать весь код преобразования вручную с этого момента.

Есть ли более простой способ? Возможно, какой-нибудь тип плагина 'formatter' для PIL?

PIL уже поддерживает некоторые из форматов, на которые я нацеливаюсь? Я не могу понять, какие форматы действительно поддерживает PIL, не копая весь исходный код.

Или есть лучшая библиотека, чем PIL, чтобы выполнить это в Python?

Любые советы будут оценены. Спасибо!

Ответы [ 5 ]

1 голос
/ 28 октября 2010

Существует также модуль с именем Грейпфрут , который позволяет выполнять преобразования между довольно большим количеством цветовых форматов.

1 голос
/ 27 октября 2009

Numpy действительно мощный, но чтобы добраться туда и обратно в PIL, требуется две копии памяти. Вы пробовали что-то вроде следующего?

im = Image.open('yourimage.png')
im.putdata([yourfunction(r,g,b) for (r,g,b) in im.getdata()])

Это довольно быстро (особенно когда вы можете использовать справочную таблицу). Я не знаком с цветовыми пространствами, о которых вы упоминаете, но, насколько я понимаю, вы знаете преобразование, поэтому реализация yourfunction(r,g,b) должна быть простой.

Также im.convert('RGBA', matrix) может быть очень мощным, поскольку он очень быстр в применении преобразования цвета через предоставленную матрицу. Однако я никогда не получал этого, чтобы делать то, что я хотел, чтобы ...: - /

1 голос
/ 19 августа 2009

Есть модуль с именем Python Colormath , который предоставляет множество различных преобразований. Настоятельно рекомендуется.

1 голос
/ 13 июля 2009

Изменение чего-то от 8 до 5 битов тривиально. В 8 битах значение находится в диапазоне от 0 до 255, в 5 битах - от 0 до 31, поэтому все, что вам нужно сделать, это разделить значение на 8. Или 4 в случае зеленого в режиме RGB565. Или 16 в режиме RGBA4444, так как он использует 4 бита на канал и т. Д.

Редактировать: Прочитав ваш вопрос еще раз, я думаю, что есть путаница (либо со мной, либо с вами). RGB555 и RGBA4444 и т. Д. На самом деле не являются форматами, такими как GIF или JPG, они являются цветовыми пространствами. Это преобразование тривиально (см. Выше). В каком формате вы хотите сохранить его, это другой вопрос. Большинство форматов файлов имеют ограниченную поддержку цветовых пространств. Я думаю, например, что JPEG всегда сохраняет его в YCbCr (но я могу ошибаться), GIF использует палитру (которая, в свою очередь, всегда RGB888, я думаю) и т.д.

0 голосов
/ 13 октября 2009

Я закончил преобразование вручную, как предложил Леннарт Регебро.

Однако чистый Python (повторяющийся по каждому пикселю) оказался слишком медленным.

Мое окончательное решение использовало PIL для загрузки изображения и numpy для работы (преобразования) массива пикселей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...