2
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它来让它工作,但我想知道是否有办法做到这一点而不必将其保存到文件中。我记得以前用过这个,但它是用于黑白图像的,这解释了为什么我以前没有问题。

4

1 回答 1

2

变化的性质向我们表明,图像上的蓝色和红色通道已被交换。在这种情况下,这意味着 cairo 以“蓝绿红阿尔法”顺序维护内存中的像素数据,而不是“红绿蓝阿尔法”。

幸运的是,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') 
于 2011-04-13T12:51:34.467 回答