Python Image Rotater, der das Bild alle 5 Sekunden um 45 Grad dreht?

GuteAntwort2021  11.08.2022, 13:53

Du hast also noch keinerlei Vorstellung davon, wie du es angehen sollst?

Harz4Player 
Fragesteller
 11.08.2022, 14:14

ein par Ideen habe ich schon wollte das wahrscheinlich mit einem Framework lösen und vielleicht mit open cv

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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.

Harz4Player 
Fragesteller
 11.08.2022, 19:46
import sys


from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QGridLayout, QWidget
from PyQt5.QtGui import QPixmap, QTransform
from PyQt5.QtCore import QTimer, Qt


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.im = QPixmap("./karte.jpg")


        self.transform = QTransform()
        self.label = QLabel()

        self.timer = QTimer()
        self.angle = 0
        self.grid = QGridLayout()
        self.label.setPixmap(self.im)
        self.grid.addWidget(self.label, 0, 0)
        
        self.setLayout(self.grid)


        #self.setGeometry(50,50,320,200)
        self.setWindowTitle("Bild")
        self.timer.start(1000)
        self.timer.timeout.connect(self.transfromer)
        print("test")
        self.show()




    def transfromer(self):
        self.angle += 45
        if self.angle == 360:
            self.angle = 0

  
        self.im = self.im.scaled(600, 600, Qt.KeepAspectRatio)
        self.im = self.im.transformed(QTransform().rotate(self.angle))
        self.label.setPixmap(self.im)


    
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

Das ist jetzt mein code, aber das Bild wird immer kleiner bis es fast ganz verschwindet

0
regex9  11.08.2022, 20:35
@Harz4Player

Du skalierst es in jedem Intervall. Es einmal am Anfang (also außerhalb des Timers) zu skalieren, sollte doch sicherlich eh ausreichen.

0
regex9  13.08.2022, 18:04
@Harz4Player

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.

0

Ich würde

self.im = self.im.scaled(600, 600, Qt.KeepAspectRatio)

mal versuchshalber in den Konstruktor schreiben und in der Methode weglassen.

Harz4Player 
Fragesteller
 11.08.2022, 21:43

Jetzt wird das Bild immer größer

0