使用pycharm编程。实现可以可以从目录中选择图片并且对该图片进行30°45°90°的顺逆时针旋转并且可以对处理后的图片进行拖拽以及缩放。画布中可以分别显示原始图像和处理后的图像。
要实现这个功能,需要使用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 著作权归作者所有。请勿转载和采集!