Python Image Rotater, der das Bild alle 5 Sekunden um 45 Grad dreht?
Ich versuche, einen Bildrotator in Python zu programmieren, der das Bild alle 5 Sekunden in einem Winkel von 45 Grad dreht und dann, wenn ich eine Stopptaste drücke, das Bild weiterdreht, bis es entweder richtig rum oder um 180 Grad gedreht anhält.
Hat jemand eine Idee wie ich das umsetzten kann?
Du hast also noch keinerlei Vorstellung davon, wie du es angehen sollst?
ein par Ideen habe ich schon wollte das wahrscheinlich mit einem Framework lösen und vielleicht mit open cv
2 Antworten
Mit einem Framework wie PyQt lässt sich so etwas einfach umsetzen. Eine QPixmap (dient der Repräsentation eines Bildes) lässt sich mit einem QTransform-Objekt rotieren.
image = QPixmap("image.png")
transform = QTransform().rotate(45)
image = image.transformed(transform)
Mit einem QTimer wiederum kann man den zeitlichen Ablauf steuern. Hier findest du einen Artikel, der zeigt, wie man die Klasse konkret einsetzen kann.
Während das Bild rotiert wird, solltest du dir in einer Variable den aktuellen Winkel speichern, denn diesen Wert benötigst du für die Endrotation zurück zum Ausgangspunkt.
Du skalierst es in jedem Intervall. Es einmal am Anfang (also außerhalb des Timers) zu skalieren, sollte doch sicherlich eh ausreichen.
Ich habe es mir noch einmal angeschaut, mit meinem vorherigen Kommentar lag ich falsch.
An sich könnte man das Bild so rotieren:
transform = QTransform()
transform = transform.rotate(self.angle)
origin_width = self.im.width()
origin_height = self.im.height()
self.im = self.im.transformed(transform)
self.im = self.im.copy(int((self.im.width() - origin_width) / 2), int((self.im.height() - origin_height) / 2), origin_width, origin_height);
Dabei wird das rotierte Ergebnis immer wieder in eine Pixmap kopiert, die die ursprüngliche Größe hat.
Bei einer Rotation ist es aber nur logisch, dass das Bild aus der ursprünglichen Fläche herausbricht. Die obige Lösung würde also die Ecken wegschneiden.
Du müsstest stattdessen je Schritt die Minimalfläche berechnen, die das Bild an Platz benötigt. Günstigerweise hat jemand hier schon einen Lösungsweg (in C++) dafür gepostet.
Ich würde
self.im = self.im.scaled(600, 600, Qt.KeepAspectRatio)
mal versuchshalber in den Konstruktor schreiben und in der Methode weglassen.
Das ist jetzt mein code, aber das Bild wird immer kleiner bis es fast ganz verschwindet