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
来使其正常工作,但我想知道是否有办法在不必将其保存到文件的情况下执行此操作。我记得之前使用过它,但它是黑白图像,这解释了为什么我以前没有问题。
答案 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')