要实现这个功能,需要使用 PyQt5 库来构建 GUI 界面,并使用 OpenCV 库来处理图片。以下是一个简单的示例代码:\n\npython\nimport sys\nimport cv2\nfrom PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QLabel, QSlider, QFileDialog\nfrom PyQt5.QtGui import QPixmap, QImage, QPainter, QCursor\nfrom PyQt5.QtCore import Qt\n\nclass ImageViewer(QWidget):\n def __init__(self):\n super().__init__()\n\n # 初始化界面\n self.setWindowTitle("Image Viewer")\n self.layout = QVBoxLayout()\n self.setLayout(self.layout)\n\n # 创建原始图片和处理后图片的标签\n self.original_label = QLabel()\n self.processed_label = QLabel()\n self.layout.addWidget(self.original_label)\n self.layout.addWidget(self.processed_label)\n\n # 创建旋转角度滑动条\n self.slider = QSlider(Qt.Horizontal)\n self.slider.setMinimum(0)\n self.slider.setMaximum(2)\n self.slider.setTickInterval(1)\n self.slider.setSliderPosition(0)\n self.slider.valueChanged.connect(self.rotate_image)\n self.layout.addWidget(self.slider)\n\n # 初始化图片和变量\n self.original_image = None\n self.processed_image = None\n\n # 监听鼠标事件\n self.setMouseTracking(True)\n\n def open_image(self):\n # 打开文件对话框选择图片\n file, _ = QFileDialog.getOpenFileName(self, "Open Image", "", "Image Files (*.png *.jpg *.jpeg *.bmp)")\n if file:\n # 读取图片并显示在原始图片标签上\n self.original_image = cv2.imread(file)\n self.display_image(self.original_label, self.original_image)\n\n def rotate_image(self):\n if self.original_image is not None:\n # 获取旋转角度\n rotation = self.slider.value() * 15\n\n # 顺时针旋转图片\n 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)\n\n # 显示处理后的图片\n self.processed_image = rotated_image\n self.display_image(self.processed_label, self.processed_image)\n\n def display_image(self, label, image):\n # 将OpenCV图片转换为Qt图像\n height, width, channels = image.shape\n bytes_per_line = channels * width\n q_image = QImage(image.data, width, height, bytes_per_line, QImage.Format_BGR888)\n\n # 缩放图像以适应标签大小\n scaled_image = q_image.scaled(label.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation)\n\n # 显示图像\n label.setPixmap(QPixmap.fromImage(scaled_image))\n\n def mouseMoveEvent(self, event):\n if self.processed_image is not None:\n # 创建拖拽框\n drag_box = cv2.rectangle(self.processed_image.copy(), (event.x(), event.y()), (event.x() + 100, event.y() + 100), (0, 255, 0), 2)\n \n # 显示处理后的图片,并更新鼠标样式\n self.display_image(self.processed_label, drag_box)\n self.setCursor(QCursor(Qt.PointingHandCursor))\n\n def mousePressEvent(self, event):\n if self.processed_image is not None:\n # 创建拖拽框\n drag_box = cv2.rectangle(self.processed_image.copy(), (event.x(), event.y()), (event.x() + 100, event.y() + 100), (0, 255, 0), 2)\n \n # 显示处理后的图片,并更新鼠标样式\n self.display_image(self.processed_label, drag_box)\n self.setCursor(QCursor(Qt.ClosedHandCursor))\n\n def mouseReleaseEvent(self, event):\n if self.processed_image is not None:\n # 创建拖拽框\n drag_box = cv2.rectangle(self.processed_image.copy(), (event.x(), event.y()), (event.x() + 100, event.y() + 100), (0, 255, 0), 2)\n \n # 显示处理后的图片,并更新鼠标样式\n self.display_image(self.processed_label, drag_box)\n self.setCursor(QCursor(Qt.PointingHandCursor))\n\nif __name__ == "__main__":\n app = QApplication(sys.argv)\n window = QMainWindow()\n viewer = ImageViewer()\n window.setCentralWidget(viewer)\n window.show()\n sys.exit(app.exec_())\n\n\n这个代码创建了一个名为"Image Viewer"的窗口,其中包含两个标签用于显示原始图片和处理后的图片。通过点击"Open Image"按钮可以选择图片文件并显示在原始图片标签上。滑动条可以控制旋转角度,旋转后的图片会显示在处理后的图片标签上。鼠标事件监听允许用户在处理后的图片上进行拖拽操作,通过在鼠标移动、按下和释放事件中创建和更新拖拽框,用户可以对处理后的图片进行拖拽操作。\n\n请注意,该代码只是一个示例,可能需要根据实际需求进行修改和优化。


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

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