pygtk: 在gtk.gdk.Pixbuf上绘制线条

4 投票
5 回答
5285 浏览
提问于 2025-04-15 13:18

我正在使用pygtk和PIL库。我已经找到了将PIL的Image转换为gtk.gdk.Pixbuf的方法。为了显示这个pixbuf,我创建了一个gtk.gdk.Image,然后用img.set_from_pixbuf来设置它。现在我想在这个图像上画几条线。显然,我需要一个Drawable来做到这一点。我开始查看文档,但现在已经打开了8到10个窗口,感觉一点也不简单。

所以,我需要输入什么样的“魔法”命令,才能得到一个代表我图片的Drawable,在上面画一些东西,然后再把它变成gdk.Image,这样我就可以在我的应用程序中显示它?

5 个回答

1

你试过使用cairo上下文吗?抱歉,我好像不能在你的帖子下评论,所以我在这里发了。

我自己还没试过,但我觉得在gtk中绘图时,cairo会对你很有帮助。你可以把cairo上下文的来源设置为pixbuf,所以我觉得这对你来说是可行的。

gdkcairocontext

3

天哪,真是太痛苦了。事情是这样的:

    w,h = pixbuf.get_width(), pixbuf.get_height()
    drawable = gtk.gdk.Pixmap(None, w, h, 24)
    gc = drawable.new_gc()
    drawable.draw_pixbuf(gc, pixbuf, 0, 0, 0, 0, -1, -1)

    #---ACTUAL DRAWING CODE---
    gc.set_foreground(gtk.gdk.Color(65535, 0, 0))
    drawable.draw_line(gc, 0, 0, w, h)
    #-------------------------

    cmap = gtk.gdk.Colormap(gtk.gdk.visual_get_best(), False)
    pixbuf.get_from_drawable(drawable, cmap, 0, 0, 0, 0, w, h)

现在它其实画出的是一条黑线,而不是红线,所以我还有一些工作要做……

4

我在做类似的事情(在一个 gdk.Drawable 上绘图),发现 set_foreground 这个方法不管用。为了用我想要的颜色进行绘图,我用了下面的代码:

# Red!
gc.set_rgb_fg_color(gtk.gdk.Color(0xff, 0x0, 0x0))

撰写回答