0

これは以前の質問の繰り返しのようなものですが、明確化されています。以前は答えが得られなかったので、新しい、より簡潔な質問で再質問したほうがよいと考えました。

透明なウィンドウの生成に成功しました。ウィンドウ内に赤い円の半透明のオーバーレイ イメージを生成することに成功しました。赤い円の中に小さな黒い四角形の不透明なオーバーレイ イメージを生成することに成功しました。ウィンドウに表示されているものを 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)
4

1 に答える 1

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
于 2012-05-01T21:21:48.033 に答える