Durchscheinende / transparente Bilder im gtk.Image()?

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Hallo zusammen,

ich würde gerne ein Bild in einem Image-Container "durchscheinen" lassen, ich glaube, dass Stichwort ist "opaque" oder "Alpha-Kanal".

Die einzigen brauchbaren Hinweise im Netz habe ich zu folgendem Schnippsel zusammengefügt - funktioniert aber leider nicht.

Code: Alles auswählen

            pb = gtk.gdk.pixbuf_new_from_file(path)
            pb = pb.add_alpha(False, 1, 1, 1)
            pixmap, mask = pb.render_pixmap_and_mask(10)
            self.image.set_from_pixmap(pixmap, mask)
Hat jemand von euch eine Idee? PIL hilft mir nicht weiter, da das Umwandeln von PIL zu Pixbuf zu aufwendig ist (im Netz finden sich immer wieder Vorschläge, das über ZWISCHENSPEICHERN zu lösen *schauder*)

Naja, für Tipps wäre ich dankbar,

brb
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Leider ist die Referenz da etwas unklar, würde aber mal behaupten, du setzt die Methode falsch ein. In der Referenz steht:
def add_alpha(substitute_color, r, g, b)

substitute_color : if False, the (r, g, b) arguments will be ignored.
Versuch es mal mit True als Parameter.
Und was liefert denn ``gtk.gdk.Pixbuf.get_has_alpha`` für einen Wert?

Ich habe außerdem kein Problem mit transparenten Bildern und PyGTK, bei mir werden sie problemlos dargestellt. Was verwendest du den für ein Format (bei mir funktioniert auf jeden Fall PNG, ICO, XPM mit Transparenz).
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Hallo ice2k3,

danke für deinen Hinweis. Aber der Parameter kann ruhig "False" sein, da damit nur angegeben wird, ob die Pixel mit der danach angegebenen Farbe (r,g,b) transparent (also völlig durchsichtig) dargestellt werden. Das will ich aber gar nicht: Mir geht es darum, das ganze Bild insgesamt zu 50% durchscheinend zu machen. add_alpha() benutze ich nur, um dem Bild einen Alpha-Kanal zu verpassen. Das geht auch, wenn subsitude_color=False ist. Ich habe es natürlich auch schon mit True probiert...

Das Problem ist, dass die Bilder, die ich durchscheinend machen will, "on the fly" aus den Internet geladen werden. Es ist also nicht so, dass ich da jetzt einfach mit Gimp einen entsprechenden Wert einstellen und das Ganze dann speichern könnte. Das Format ist überwiegend png - und damit "alpha-fähig".

Gruß,

brb
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Hallo zusammen,

na, manchmal ist es doch gut an der Stange zu bleiben: Man kann direkt das Pixelarray des Pixbufs manipulieren und so den Alpha-Wert festlegen:

Code: Alles auswählen

    def set_image_alpha(image, alpha):
        pixbuf = image.get_pixbuf()
        pixbuf = pixbuf.add_alpha(False, 1,1,1)
        pixel_array = pixbuf.get_pixels_array()
        pixel_array[:,:,3] = alpha
        image.set_from_pixbuf(pixbuf)
Ich hoffe, das hilft jemanden weiter.

Schöne Grüße,

brb
Antworten