質問

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として設定できるので、これはあなたに役立つと思います。

gdkcairocontext

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 のサブクラスなので、描画できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top