1

如何创建一个像素值设置为透明的 PyGTK 像素图?我知道这创建深度为 1 的像素图并将其设置为蒙版有关,但我发现它要么什么都不做,要么在绘制时完全擦除我的像素图。目前,我制作了一个像素图

r = self.get_allocation()
p1 = gtk.gdk.Pixmap(self.window,r.width,r.height)
p1_c = p1.cairo_create()

然后用开罗在上面画黑线。我想做的是让所有未被线条覆盖的区域都是透明的(例如,使白色成为透明颜色),这样当我用 draw_drawable 将它绘制到窗口时,它会将所有东西都留在“下面”完好无损的。

有关此问题的常见问题解答和邮件列表发布非常无用,因为它们已经过时了。这里一定有人知道!

4

2 回答 2

2

我不认为你可以用Pixmapor做你想做的事Pixbuf,但这里有两种策略可以在现有的Widget. 最明显的就是捕捉到 draw 事件并直接绘制到Widget'sDrawable上,中间没有保留图像:

from gtk import Window, Button, main
from math import pi
import cairo

w = Window()
b = Button("Draw on\ntop of me!")

def scribble_on(cr):
    cr.set_source_rgb(0, 0, 0)
    cr.rectangle(10, 10, 30, 30)
    cr.fill()
    cr.arc(50, 50, 10, 0, pi)
    cr.stroke()

def expose_handler(widget, event):
    cr = widget.window.cairo_create()
    cr.rectangle(event.area.x, event.area.y,
                 event.area.width, event.area.height)
    cr.clip()
    scribble_on(cr)
    return False

b.connect_after("expose_event", expose_handler)
w.add(b)
w.set_size_request(100, 100)
w.show_all()
main()

第二种选择,如果您想要一个不需要在每次请求重绘时更新的中间 ARGB 图像,则将图像预渲染为ImageSurface. 这是上面的替换expose_handler,它只绘制一次图像:

import cairo
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 100, 100)
scribble_on(cairo.Context(surface))

def expose_image_handler(widget, event):
    cr = widget.window.cairo_create()
    cr.rectangle(event.area.x, event.area.y,
                 event.area.width, event.area.height)
    cr.clip()
    cr.set_source_surface(surface)
    cr.paint()

如果这是您正在寻找的东西,我建议您更新问题的标题以反映您的真正需求:)。

于 2009-06-15T16:00:01.547 回答
1

看起来您想使用 Pixbuf 而不是 Pixmap。Pixbuf 包含一个 alpha 设置,它将为您提供透明度,而 Pixmap 则没有。

于 2009-06-10T00:03:54.887 回答