Tkinter leinwand zoom + verschieben / schwenken

9

Tkinter Canvas-Widget verfügt über integrierte Funktionen für:

  • Verschieben / Verschieben der Zeichenfläche (z. B. mit Klick + Ziehen) mit canvas.scan_mark und canvas.scan_dragto , siehe diese Frage

  • zoomen Sie die Vektorelemente auf der Leinwand mit canvas.scale , aber leider funktioniert nicht für Bitmap-Bilder auf der Leinwand

Glücklicherweise ermöglicht diese Methode das Zoomen von Bildern (indem Sie den gezoomten Teil des Bildes manuell neu zeichnen). Aber:

  1. Wenn wir einen bestimmten Bereich der Zeichenfläche neu zeichnen, funktioniert die Verschieben / Verschieben-Funktion nicht mehr ...

  2. Wir müssen unbedingt mehr als den aktuell angezeigten Bereich rendern, um das Verschieben / Verschieben zu ermöglichen. Nehmen wir an, wir haben 1000x1000 Bitmap auf der Leinwand, und wir wollen um den Faktor 50x zoomen ... Wie vermeiden Sie eine 50.000 x 50.000 Pixel Bitmap im Speicher? (2,5 Gigapixel im RAM ist zu groß). Wir könnten darüber nachdenken, nur das Ansichtsfenster zu rendern, oder etwas mehr als das aktuelle Ansichtsfenster, um das Verschieben zu erlauben, aber was dann, wenn das Verschieben zum Rand der gerenderten Zone führt?

Wie funktioniert die Funktion "Verschieben / Schwenken + Zoomen" auf der Tkinter-Leinwand, die für Bilder geeignet ist?

    
Basj 14.01.2017, 23:35
quelle

2 Antworten

2

Erweitertes Zoom-Beispiel. Wie in Google Maps.

Beispielvideo ( längeres Video hier ):

Es zoomt nur eine Kachel, aber nicht das gesamte Bild. So nimmt die gezoomte Kachel konstanten Speicher ein und stopft sie nicht mit einem riesigen skalierten Bild für die großen Zooms. Für das vereinfachte Zoom-Beispiel schau hier .

Getestet unter Windows 7 64-Bit und Python 3.6.2.

Vergessen Sie nicht, am Ende des Skripts einen Pfad zu Ihrem Bild zu platzieren.

%Vor%     
foo bar 07.01.2018, 12:50
quelle
1

Sie könnten Kartenkacheln für diesen Fall verwenden. Die Kacheln können für die Zoomstufe spezifisch sein. Nachdem Sie die Kacheln basierend auf der Schwenk- und Zoomstufe ausgewählt haben, können Sie sie mit Canvas.create_image auf der Leinwand positionieren.

Angenommen, Sie verfügen über eine Kachelklasse mit ihren Koordinaten und dem Bild, können Sie basierend auf der Schwenk-, Zoom- und Bildgröße für sichtbare Kacheln auswählen.

%Vor%

Es gibt eine vollständige Auswahl davon in Kachelbasierte Geospatial Information Systems von John Sample und Elias Ioup in das Kapitel Tiled Mapping Clients.

    
user650881 24.01.2017 11:36
quelle