要实现这个功能,需要使用PyQt5库来构建GUI界面,并使用OpenCV库来处理图片。以下是一个简单的示例代码:

import sys
import cv2
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QLabel, QSlider, QFileDialog
from PyQt5.QtGui import QPixmap, QImage, QPainter, QCursor
from PyQt5.QtCore import Qt

class ImageViewer(QWidget):
    def __init__(self):
        super().__init__()

        # 初始化界面
        self.setWindowTitle("Image Viewer")
        self.layout = QVBoxLayout()
        self.setLayout(self.layout)

        # 创建原始图片和处理后图片的标签
        self.original_label = QLabel()
        self.processed_label = QLabel()
        self.layout.addWidget(self.original_label)
        self.layout.addWidget(self.processed_label)

        # 创建旋转角度滑动条
        self.slider = QSlider(Qt.Horizontal)
        self.slider.setMinimum(0)
        self.slider.setMaximum(2)
        self.slider.setTickInterval(1)
        self.slider.setSliderPosition(0)
        self.slider.valueChanged.connect(self.rotate_image)
        self.layout.addWidget(self.slider)

        # 初始化图片和变量
        self.original_image = None
        self.processed_image = None

        # 监听鼠标事件
        self.setMouseTracking(True)

    def open_image(self):
        # 打开文件对话框选择图片
        file, _ = QFileDialog.getOpenFileName(self, "Open Image", "", "Image Files (*.png *.jpg *.jpeg *.bmp)")
        if file:
            # 读取图片并显示在原始图片标签上
            self.original_image = cv2.imread(file)
            self.display_image(self.original_label, self.original_image)

    def rotate_image(self):
        if self.original_image is not None:
            # 获取旋转角度
            rotation = self.slider.value() * 15

            # 顺时针旋转图片
            rotated_image = cv2.rotate(self.original_image, cv2.ROTATE_90_CLOCKWISE if rotation == 1 else cv2.ROTATE_90_COUNTERCLOCKWISE if rotation == 2 else cv2.ROTATE_180)

            # 显示处理后的图片
            self.processed_image = rotated_image
            self.display_image(self.processed_label, self.processed_image)

    def display_image(self, label, image):
        # 将OpenCV图片转换为Qt图像
        height, width, channels = image.shape
        bytes_per_line = channels * width
        q_image = QImage(image.data, width, height, bytes_per_line, QImage.Format_BGR888)

        # 缩放图像以适应标签大小
        scaled_image = q_image.scaled(label.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation)

        # 显示图像
        label.setPixmap(QPixmap.fromImage(scaled_image))

    def mouseMoveEvent(self, event):
        if self.processed_image is not None:
            # 创建拖拽框
            drag_box = cv2.rectangle(self.processed_image.copy(), (event.x(), event.y()), (event.x() + 100, event.y() + 100), (0, 255, 0), 2)
            
            # 显示处理后的图片,并更新鼠标样式
            self.display_image(self.processed_label, drag_box)
            self.setCursor(QCursor(Qt.PointingHandCursor))

    def mousePressEvent(self, event):
        if self.processed_image is not None:
            # 创建拖拽框
            drag_box = cv2.rectangle(self.processed_image.copy(), (event.x(), event.y()), (event.x() + 100, event.y() + 100), (0, 255, 0), 2)
            
            # 显示处理后的图片,并更新鼠标样式
            self.display_image(self.processed_label, drag_box)
            self.setCursor(QCursor(Qt.ClosedHandCursor))

    def mouseReleaseEvent(self, event):
        if self.processed_image is not None:
            # 创建拖拽框
            drag_box = cv2.rectangle(self.processed_image.copy(), (event.x(), event.y()), (event.x() + 100, event.y() + 100), (0, 255, 0), 2)
            
            # 显示处理后的图片,并更新鼠标样式
            self.display_image(self.processed_label, drag_box)
            self.setCursor(QCursor(Qt.PointingHandCursor))

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = QMainWindow()
    viewer = ImageViewer()
    window.setCentralWidget(viewer)
    window.show()
    sys.exit(app.exec_())

这个代码创建了一个名为"Image Viewer"的窗口,其中包含两个标签用于显示原始图片和处理后的图片。通过点击"Open Image"按钮可以选择图片文件并显示在原始图片标签上。滑动条可以控制旋转角度,旋转后的图片会显示在处理后的图片标签上。鼠标事件监听允许用户在处理后的图片上进行拖拽操作,通过在鼠标移动、按下和释放事件中创建和更新拖拽框,用户可以对处理后的图片进行拖拽操作。

请注意,该代码只是一个示例,可能需要根据实际需求进行修改和优化


原文地址: http://www.cveoy.top/t/topic/hZMX 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录