gpt4 book ai didi

python - PyGTK 中的像素图透明度

转载 作者:行者123 更新时间:2023-12-01 00:00:47 26 4
gpt4 key购买 nike

如何创建将一个像素值设置为透明的 PyGTK 像素图?我知道它与创建深度为 1 的像素图并将其设置为 mask 有关,但我发现它要么不执行任何操作,要么在绘制时完全删除我的像素图。目前,我制作了一个像素图

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

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

有关此问题的常见问题解答和邮件列表帖子毫无帮助,因为它们已经过时了。这里一定有人知道!

最佳答案

我认为您无法使用 PixmapPixbuf 完成您想要的操作,但这里有两种在现有 之上实现涂鸦的策略小部件。最明显的一个是捕获绘制事件并直接绘制到 WidgetDrawable 上,中间不保留图像:

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()

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

关于python - PyGTK 中的像素图透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/973073/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com