2009-07-31 37 views
3

我使用pygtk和PIL。我已经想出了一种将PIL Image s转换为gtk.gdk.Pixbuf s的方法。我做什么来显示pixbuf是我创建一个gtk.gdk.Image,然后使用img.set_from_pixbuf。我现在想在这张图上画几行。显然我需要一个Drawable来做到这一点。我已经开始浏览文档,但是我已经打开了8-10个窗口,并且它不是简单的。pygtk:画线到gtk.gdk.Pixbuf

所以 - 我需要输入什么魔法才能得到代表我的照片的Drawable,然后将其绘制成一个gdk.Image,以便我可以在我的应用程序上显示它?

回答

4

我在做类似的东西(绘制一个GDK。 Drawable),我发现set_foreground不起作用。实际上把利用我想要的颜色,我使用了以下内容:

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

您是否尝试过cairo上下文?对不起,我似乎无法评论你的帖子。因此我在这里发布。

我还没有尝试过这个,但我相信cairo是你绘制gtk的朋友。你可以设置你的开罗上下文的来源为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) 

它实际上画一条黑线ATM,而不是红色的,所以我有一些工作剩下要做......

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) 

应该做的伎俩。

1

您应该连接到expose-event(GTK 2)或draw(GTK 3)信号。在该处理程序中,只需使用image.window即可获取小部件的gtk.gdk.Window;这是gtk.gdk.Drawable的一个子类,所以你可以借鉴它。