为什么开罗搞乱了我的色彩?

时间:2011-04-12 18:41:01

标签: python image image-processing cairo pycairo

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 个答案:

答案 0 :(得分:2)

更改的性质向我们显示图像上的蓝色和红色通道已被交换。在这种情况下,这意味着cairo将像素数据保存在内存中的蓝绿色Alpha“顺序,而不是”红绿蓝Alpha“。

幸运的是,Python的PIL支持该反转:只需将“BGRA”作为模式参数传递给原始解码器(代替函数调用中的第二个“RGBA”)。

另外,认为您不需要使用PIL打开图像 - cairo直接加载它,您可以从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')