Почему Каир портит мои цвета? - PullRequest
1 голос
/ 12 апреля 2011
import cairo
from PIL import Image as im

orig_image = im.open('Camilla_Belle_photo_3.jpg') #http://i56.tinypic.com/261i5cn.jpg
surface = cairo.ImageSurface.create_from_png('Camilla_Belle_photo_3.png') #http://i52.tinypic.com/20gmypv.png
context = cairo.Context(surface)
#draw stuff
other_image = im.frombuffer('RGBA', orig_image.size, surface.get_data(), 'raw', 'RGBA', 0, 1)
other_image.save('test.png') #resulting image: http://i51.tinypic.com/farns.png

Я могу использовать surface.write_to_png, чтобы заставить его работать, но мне было интересно, есть ли способ сделать это без необходимости сохранять его в файл. Я помнил, как использовал это раньше, но это было для черно-белых изображений, что объясняет, почему у меня не было проблем раньше.

1 Ответ

2 голосов
/ 13 апреля 2011

Характер изменений показывает, что синий и красный каналы на изображении поменялись местами. В этом случае это означает, что cairo сохраняет данные пикселей в памяти в порядке «Blue Green Red Alpha», а не «Red Green Blue Alpha».

К счастью, PIL Python поддерживает эту инверсию: просто передайте «BGRA» в качестве параметра режима в необработанный декодер (вместо второго «RGBA» в вызове функции).

Кроме того, представьте, что вам не нужно открывать изображение с помощью PIL - cairo загружает его напрямую, и вы можете получить размер с поверхности Каира:

import cairo
from PIL import Image as im

surface = cairo.ImageSurface.create_from_png('Camilla_Belle_photo_3.png') 
context = cairo.Context(surface)
#draw stuff
size = surface.get_width(), surface.get_height()
other_image = im.frombuffer('RGBA', size, surface.get_data(), 'raw', 'BGRA', 0, 1)
other_image.save('test.png') 
...