Maskieren von Bildern mit PyCairo

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
squee
User
Beiträge: 2
Registriert: Donnerstag 17. März 2016, 22:40

Hallo zusammen,

ich lerne gerade Python. Nachdem ich mir PyGTK angesehen habe bin ich nun bei PyCairo angelangt.

Seit vielen Stunden versuche ich nun auf einer Zeichenfläche in einem Fenster zwei beschnittene Bilder zu zeichnen.
Meinen Recherchen zu folge sollte ich dazu die mask_surface Methode nutzen.

Mein Ziel is es am Ende eine Funktion zu haben die in etwa so aussehen könnte.

Code: Alles auswählen

def drawImage(ctx, x, y, width, height, dx, dy, dwidth, dheight)
Bild

Der Rote Bildausschnitt soll also frei platziert werden können.

Ich bin nun an einem Punkt angekommen an dem ich alleine nicht mehr weiter komme.
Über die bekannten Suchmaschinen konnte leider auch keinen hilfreichen Beitrag finden.

Ich kann zwar die Bilder maskieren, das maskierte Bild lässt sich jedoch nicht frei platzieren.
Wenn ich versuche das maskierten Bildausschnitt zu verschieben verschiebe ich auch die Maskierung.

Hier ist noch der Code:

Code: Alles auswählen

from gi.repository import Gtk, GLib
import cairo


class Example(Gtk.Window):

    def __init__(self):
        super(Example, self).__init__()
        
        self.darea = Gtk.DrawingArea()
        self.darea.connect("draw", self.on_draw)
        self.add(self.darea)
               
        
        self.set_title("Mask")
        self.resize(800, 400)
        self.set_position(Gtk.WindowPosition.CENTER)
        self.connect("delete-event", Gtk.main_quit)
        self.show_all()
        self.image = cairo.ImageSurface.create_from_png("demo.png")        
        self.ims = cairo.ImageSurface(cairo.FORMAT_ARGB32, 40, 40)           
        
        
        
    
    def on_draw(self, wid, cr):
        
        ic = cairo.Context(self.ims)

        ic.rectangle(0, 0, 40, 40)
        ic.fill()

        cr.set_source_surface(self.image, 0, 0)
        cr.mask_surface(self.ims, 0, 0)        

  

    
def main():
    
    app = Example()
    Gtk.main()
        
        
if __name__ == "__main__":    
    main()
Vielen Dank!
Gruß Squee
BlackJack

@squee: Du musst halt beides verschieben. Sagen wir mal Du willst aus dem grossen Bild einen Ausschnitt mit dem Versatz (10, 10), dann verschiebst Du das grosse Bild um (-10, -10). Dann wäre der Ausschnitt im Fenster an Position (0, 0). Und den Ausschnitt möchtest Du aber an Position (20, 50) im Fenster anzeigen, dann musst Du das grosse Bild um (-10 + 20, -10 + 50) und den Ausschnitt um (20, 50) verschieben.
squee
User
Beiträge: 2
Registriert: Donnerstag 17. März 2016, 22:40

Hallo BlackJack,

vielen Dank für deine Hilfe.

Ich war durch andere APIs wie z.B. die JavaScript API für das Canvas Element ein etwas anderes Vorgehensmodell gewohnt.
Das hatte mich irritiert. Jetzt habe ich die Handhabung verstanden.

Viele Grüße
squee
Antworten