我正在使用Pygtk和PIL。我已经找到了将PIL Image
转换为gtk.gdk.Pixbuf
的方法。我在显示pixbuf时所做的是创建gtk.gdk.Image
,然后使用img.set_from_pixbuf
。我现在想在这张图片上画几条线。显然我需要一个Drawable
来做到这一点。我已经开始查看文档,但我已经打开了8-10个窗口,而且根本不是直截了当的。
那么 - 我需要输入什么魔法才能让Drawable代表我的图片,绘制一些东西,然后把它变成gdk.Image
以便我可以在我的应用上显示它?
答案 0 :(得分:4)
我正在做类似的事情(绘制到gdk.Drawable),我发现set_foreground不起作用。为了使用我想要的颜色实际绘制,我使用了以下内容:
# Red!
gc.set_rgb_fg_color(gtk.gdk.Color(0xff, 0x0, 0x0))
答案 1 :(得分: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)
它实际上画了一条黑线ATM,而不是红线,所以我还有一些工作要做......
答案 2 :(得分:1)
您是否尝试过cairo上下文?抱歉,我似乎无法对你的帖子发表评论。因此我将它发布在这里。
我自己没有试过这个,但我相信在绘制gtk时,cairo是你的朋友。你可以将你的cairo上下文的来源设置为pixbuf所以我认为这对你有用。
答案 3 :(得分:1)
image = gtk.Image()
pixmap,mask = pixbuf.render_pixmap_and_mask() # Function call
cm = pixmap.get_colormap()
red = cm.alloc_color('red')
gc = pixmap.new_gc(foreground=red)
pixmap.draw_line(gc,0,0,w,h)
image.set_from_pixmap(pixmap,mask)
应该做的伎俩。
答案 4 :(得分:1)
您应该连接到expose-event
(GTK 2)或draw
(GTK 3)信号。在该处理程序中,只需使用image.window
即可获取小部件的gtk.gdk.Window
;这是gtk.gdk.Drawable
的子类,因此您可以使用它。