1

1 つのピクセル値を透明に設定して PyGTK ピックスマップを作成するにはどうすればよいですか? 深さ1のピックスマップを作成してマスクとして設定することに関係があることは知っていますが、描画時に何もしないか、ピックスマップを完全に消去するだけです。現時点では、ピックスマップを作成しています

r = self.get_allocation()
p1 = gtk.gdk.Pixmap(self.window,r.width,r.height)
p1_c = p1.cairo_create()

次に、カイロを使用して全体に黒い線を引きます。私ができるようにしたいのは、線で覆われていないすべての領域を透明にすることです(たとえば、白を透明色にします)。無傷。

この問題に関する FAQ やメーリング リストへの投稿は、あまりにも古くなっているため、ほとんど役に立ちません。誰かがここを知っている必要があります!

4

2 に答える 2

2

Pixmaporでやりたいことができるとは思いませんがPixbuf、既存の の上に落書きを実装するための 2 つの戦略を次に示しWidgetます。最も明白な方法は、 draw イベントをキャッチしてWidget'sDrawableに直接描画し、途中に画像を保持しないようにすることです:

from gtk import Window, Button, main
from math import pi
import cairo

w = Window()
b = Button("Draw on\ntop of me!")

def scribble_on(cr):
    cr.set_source_rgb(0, 0, 0)
    cr.rectangle(10, 10, 30, 30)
    cr.fill()
    cr.arc(50, 50, 10, 0, pi)
    cr.stroke()

def expose_handler(widget, event):
    cr = widget.window.cairo_create()
    cr.rectangle(event.area.x, event.area.y,
                 event.area.width, event.area.height)
    cr.clip()
    scribble_on(cr)
    return False

b.connect_after("expose_event", expose_handler)
w.add(b)
w.set_size_request(100, 100)
w.show_all()
main()

再描画が要求されるたびに更新する必要のない中間 ARGB イメージが必要な場合の 2 番目のオプションは、イメージをImageSurface. 上記の の代わりにexpose_handler、画像を 1 回だけ描画します。

import cairo
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 100, 100)
scribble_on(cairo.Context(surface))

def expose_image_handler(widget, event):
    cr = widget.window.cairo_create()
    cr.rectangle(event.area.x, event.area.y,
                 event.area.width, event.area.height)
    cr.clip()
    cr.set_source_surface(surface)
    cr.paint()

これがあなたが探しているものである場合は、質問のタイトルを更新して、実際のニーズを反映することをお勧めします:)。

于 2009-06-15T16:00:01.547 に答える
1

Pixmap ではなく Pixbuf を使用したいようです。Pixbuf にはアルファ設定が含まれており、透過性が得られますが、Pixmap にはありません。

于 2009-06-10T00:03:54.887 に答える