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 はメモリ内のピクセル データを "Red Green Blue Alpha" ではなく、Blue Green Red Alpha" の順序で維持することを意味します。

幸いなことに、Python の PIL はその反転をサポートしています。モード パラメータとして "BGRA" を生のデコーダに渡すだけです (関数呼び出しの 2 番目の "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 に答える