Страницы

Поиск по вопросам

четверг, 23 января 2020 г.

Вращение изображения в PyQt5

#python #python_3x #qt5 #pyqt5


Нужно открыть картинку и вращать ее по часовой стрелке по команде. Вот мой код, в
который нужно вставить данную фичу:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import sys
from PyQt5.QtWidgets import (QWidget, QInputDialog,
    QPushButton, QApplication, QTextEdit, QLabel, QLineEdit,QFrame )
from PyQt5.QtGui import QBrush, QPalette, QPixmap, QPainter, QPen, QImage
from PyQt5.QtCore import Qt, QTimer, QPointF, QRect
from PIL import Image


class Collector(QWidget):

    def __init__(self):
        super().__init__()
        self.timer = QTimer()
        self.timer.timeout.connect(self.process_timeout)
        self.timer.start(10)  # 50 -- период в милисекундах
        self.phi = 0
        self.lbl = QLabel(self)

    def process_timeout(self):
        if self.phi == 0:
            self.phi += 5
        elif self.phi == 5:
            self.phi -= 5
        self.update()
    def showInputTc_h(self):
        text, ok = QInputDialog.getText(self, "input Dialog", "Enter data:")
        if ok:
            self.textEdit_Tc_h.setText(str(text))

    def showInputTr(self):
        text, ok = QInputDialog.getText(self, "input Dialog", "Enter data:")
        if ok:
            self.textEdit_Tr.setText(str(text))

    def showInputTt(self):
        text_Tt, ok = QInputDialog.getText(self, "input Dialog", "Enter data:")
        if ok:
            self.textEdit_Tt.setText(str(text_Tt))

    def lable_text_button(self):
        Tt = QPushButton("Tt", self)
        Tt.move(480, 130)
        Tc_h = QPushButton("Tc-h", self)
        Tc_h.move(400, 10)
        Tr = QPushButton("Tr", self)
        Tr.move(900, 530)

        self.textEdit_Tt = QLineEdit(self)
        self.textEdit_Tt.setGeometry(QRect(100, 90, 81, 31))
        self.textEdit_Tt.setObjectName("textEdit")
        self.textEdit_Tt.move(400, 130)
        Tt.clicked.connect(self.showInputTt)

        self.textEdit_Tr = QLineEdit(self)
        self.textEdit_Tr.setGeometry(QRect(100, 90, 81, 31))
        self.textEdit_Tr.setObjectName("textEdit")
        self.textEdit_Tr.move(800, 530)
        Tr.clicked.connect(self.showInputTr)

        self.textEdit_Tc_h = QLineEdit(self)
        self.textEdit_Tc_h.setGeometry(QRect(100, 90, 81, 31))
        self.textEdit_Tc_h.setObjectName("textEdit")
        self.textEdit_Tc_h.move(300, 10)
        Tc_h.clicked.connect(self.showInputTc_h)

    def get_image_size(self, img):
        im = Image.open(img)
        (width, height) = im.size
        return (width, height) # вернем ширину и висоту

    def draw_y(self, qp, x0, y0, range_int, const_y):
        for i in range(range_int):
            y0 -= 20 * i
            x1 = x0
            y1 = y0 + 10
            qp.drawLine(QPointF(x0, y0), QPointF(x1, y1))
            y0 = const_y

    def draw_x(self, qp, x0, y0, range_int, const_x):
        for i in range(range_int):
            x0 += 20 * i
            y1 = y0
            x1 = x0 + 10
            qp.drawLine(QPointF(x0, y0), QPointF(x1, y1))
            x0 = const_x

    def paintEvent(self, e):
        qp = QPainter()
        qp.begin(self)
        pen = QPen(Qt.red, 1)
        qp.translate(0, self.height())
        qp.scale(1, -1)
        qp.setPen(pen)
        pomp = QPixmap()
        QFrame.paintEvent(self, e)

        # width1 = 992,
        # height = 679
        list_y = [(292, 627, 12), (292, 320, 4), (485, 595, 2), (183, 183, 7), (465,
40, 3)]
        list_x = [(150, 637, 7), (310, 385, 6), (486, 607, 27), (183, 64, 14), (480,
64, 6), (690, 64, 16)]
        for y in list_y:
            self.draw_y(qp=qp, x0=y[0], y0=y[1]+self.phi, range_int=y[2], const_y=y[1]+self.phi)

        for x in list_x:
            self.draw_x(qp=qp, x0=x[0]+self.phi, y0=x[1], range_int=x[2], const_x=x[0]+self.phi)

        pen = QPen(Qt.blue, 1)
        qp.setPen(pen)
        list_y_cold = [(5, 627, 15), (240, 386, 3), (183, 317, 4), (296, 183, 2),
(485, 312, 3), (652, 562, 15)]
        list_x_cold = [(10, 347, 3), (113, 347, 3), (199, 347, 6), (345, 347, 4),
(296, 153, 37), (485, 272, 26), (656, 570, 18)]
        for y_cold in list_y_cold:

            self.draw_y(qp=qp, x0=y_cold[0], y0=y_cold[1]+self.phi, range_int=y_cold[2],
const_y=y_cold[1]+self.phi)

        for x_cold in list_x_cold:
            self.draw_x(qp=qp, x0=x_cold[0]+self.phi, y0=x_cold[1], range_int=x_cold[2],
const_x=x_cold[0]+self.phi)
        qp.end()

def main():
    app = QApplication(sys.argv)

    w = Collector()
    palette = QPalette()
    palette.setBrush(QPalette.Background,       QBrush(QPixmap("images/scheme.jpg")))
    size = w.get_image_size("images/scheme.jpg")
    w.setMaximumSize(size[0], size[1])
    w.setMinimumSize(size[0], size[1])
    w.setWindowTitle('Sun')
    w.setPalette(palette)
    w.lable_text_button()
    w.show()

    sys.exit(app.exec())

if __name__ == '__main__':
    main()

    


Ответы

Ответ 1



Чтобы вращать картинку, отображаемую с помощью QPixmap, можно QTransform().rotate() использовать. Код, основанный на ответе @Jean-Sébastien: #!/usr/bin/python3 """Usage: rotate-image """ from PyQt5.Qt import QImage, QLabel, QPixmap, QTransform, QWidget, Qt class ImageRotor(QWidget): def __init__(self, image_path, parent=None): super().__init__(parent) self.label = QLabel(self) self.image = QImage(image_path) # keep original image for rotation self.angle = 0 self.label.setAlignment(Qt.AlignCenter) # NOTE: keep image on screen pm = QPixmap(self.image) self.resize(pm.width(), pm.height()) # fit window to image self.label.setPixmap(pm) self.setWindowTitle('PyQt5 Image Rotor') def keyPressEvent(self, event): # on any key self.angle += 45 if event.key() == Qt.Key_Down else -45 t = QTransform().rotate(self.angle) self.label.setPixmap(QPixmap(self.image).transformed(t)) return super().keyPressEvent(event) if __name__ == '__main__': import sys from PyQt5.Qt import QApplication if len(sys.argv) < 2: # wrong arguments sys.exit(__doc__) # print usage app = QApplication(sys.argv) w = ImageRotor(sys.argv[1]) # center on screen w.move(app.desktop().screen().rect().center() - w.rect().center()) w.show() sys.exit(app.exec_()) При нажатии на любую клавишу, изображение, указанное в командной строке, вращается на 45 градусов. Если нажать на клавишу ↓ («вниз»), то по часовой стрелке вращение. начальный размер окна подгонятся под изображение используется выравнивание по центру, чтобы при повороте изображение не убегало сохраняется оригинальное изображение, чтобы повторные повороты не искажали бы картинку

Комментариев нет:

Отправить комментарий