如何保存分层pyCairo pyGTK图像

时间:2012-05-01 20:55:09

标签: python pygtk pycairo

这有点像先前问题的重复,但澄清了。 由于我之前没有得到答案,我认为最好再重新问一下 在一个新的,更简洁的问题。

我成功生成了透明窗口。 我成功地在窗口内生成了一个红色圆圈的半透明叠加图像。 我成功地在红色圆圈内生成了一个小的黑色方块的不透明叠加图像。 如何保存到窗口中看到的PNG文件。 我搜索了stackoverflow,nullege和google没有成功。

下面代码的最后两行显示我失败的保存。 我可以用什么代码替换它来查看包含我在屏幕上看到的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 个答案:

答案 0 :(得分: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