pygtk:gtk.gdk.Pixbufに線を引きます
質問
PILでpygtkを使用しています。 PILの Image
sを gtk.gdk.Pixbuf
sに変換する方法をすでに見つけました。 pixbufを表示するには、 gtk.gdk.Image
を作成し、 img.set_from_pixbuf
を使用します。この画像に数本の線を描きたいと思います。どうやらそれを行うには Drawable
が必要です。私はドキュメントを調べ始めましたが、すでに8〜10個のウィンドウを開いており、まったく簡単ではありません。
だから-私の写真を表すDrawableを取得し、それに何かを描画し、それを gdk.Image
に変換して表示できるようにするには、どの魔法を入力する必要がありますかアプリ?
解決
似たようなこと(gdk.Drawableへの描画)を行っていましたが、set_foregroundが機能しないことがわかりました。私が欲しかった色を使って実際に描くために、私は以下を使いました:
# Red!
gc.set_rgb_fg_color(gtk.gdk.Color(0xff, 0x0, 0x0))
他のヒント
ああ、なんてこった。とても痛い。ここにあります:
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を描画するので、やるべきことが残っています...
cairo contextを試しましたか?申し訳ありませんが、投稿にコメントできないようです。したがって、ここに投稿しました。
私はこれを自分で試したことはありませんが、gtkでの描画に関してはcairoがあなたの友達だと思います。 cairoコンテキストのソースをpixbufとして設定できるので、これはあなたに役立つと思います。
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)
トリックを行う必要があります。
expose-event
(GTK 2)または draw
(GTK 3)シグナルに接続する必要があります。そのハンドラーでは、単に image.window
を使用してウィジェットの gtk.gdk.Window
を取得します。これは gtk.gdk.Drawable
のサブクラスなので、描画できます。