2012-05-01 10 views
0

これは以前の質問の繰り返しですが、明確化されています。 私は前に答えが得られていないので、新しい簡潔な質問で にそれを再度尋ねる方がよいと思いました。階層化pyCairo pyGTK画像を保存する方法

透明なウィンドウの生成に成功しました。 ウィンドウ内に赤い円の半透明のオーバーレイ画像を生成するのに成功しました。 赤い円の中に小さな黒い四角の不透明なオーバーレイ画像を生成するのに成功しました。 ウィンドウに表示されているものをPNGファイルに保存するにはどうすればいいですか? 私はstackoverflow、nullege、googleを検索して成功していません。

以下のコードの最後の2行は、失敗した保存を示しています。 どのコードを使って、これを置き換えて、画面に表示されているものを含むPNGを見ることができます。

import pygtk 
pygtk.require('2.0') 
import gtk, cairo 
from math import pi 

# Window setup 
window = gtk.Window(gtk.WINDOW_TOPLEVEL) 
window.set_decorated(True) 
window.set_app_paintable(True) 
window.set_colormap(window.get_screen().get_rgba_colormap()) 
window.realize() 
window.show() 
window.set_flags(gtk.HAS_FOCUS | gtk.CAN_FOCUS) 
window.grab_focus() 

# Cairo transparent setup 
cr = widget.window.cairo_create() 
cr.set_operator(cairo.OPERATOR_CLEAR) 
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 201, 201) 
cr.rectangle(0, 0, 201, 201) 
cr.fill() 

# Cairo semi-transparent setup 
cr.set_operator(cairo.OPERATOR_OVER) 
cr.set_source_rgba(0.5, 0.0, 0.0, 0.5) 
cr.arc(100, 100, 100, 0, pi*2) 
cr.fill() 

# Cairo opaque setup 
cr.set_operator(cairo.OPERATOR_OVER) 
width = 3 
r, g, b, a = (0.0,0.0,0.0,1.0) 
cr.set_source_rgba(r,g,b,a) 
cr.rectangle(-1, -1, 3, 3) 
cr.fill() 

# Restore default Cairo conditions 
cr.set_operator(cairo.OPERATOR_OVER) 

# Save layered image to a png image file 
with open('layered.png', 'w+') as png: 
    surface.write_to_png(png) 

答えて

1

イメージサーフェスをレンダリングしているように見えますが、イメージサーフェスにはコンテンツがありません。代わりに、あなたがあなたの図面をやっているウィンドウコンテキストのサーフェスをレンダリングする必要があります。代わりにこれを試してみてください:

surface = cr.get_group_target() # get the surface being drawn to the window via your context 
surface.write_to_png(png) # write the surface to a file 
+0

ありがとうございます。それがトリックでした。 – jlettvin

+0

私は間違いをこれを修正する間違いを修正しました。半透明で不透明なマークアップは表示されますが、下のウィンドウからの背景は表示されません。マークアップは背景を飾ることを目的としているので、背景を紛失すると結果がほとんど役に立たなくなります。それを捕らえるための追加のステップはありますか? – jlettvin