pyqt5 实现图像显示、缩放,平移

该博客介绍了一种使用PyQt5库中的QGraphicsView和QGraphicsPixmapItem实现图像显示、缩放和平移的方法。通过创建自定义的ImageWidget类,实现了图像在窗口中的适应性缩放、鼠标事件处理(包括点击、滚动和移动)以及双击重置图像大小的功能。此外,还提供了一个ImageLabel类用于封装图像显示空间,支持接收图像数据并显示。

在这里只贴出图像的相关代码,基于QGraphicsPixmapItem实现:

# -*- coding: utf-8 -*-
from PyQt5.QtCore import Qt, QPoint, QRectF, pyqtSignal, QObject
from PyQt5.QtGui import QPainter, QPixmap
from PyQt5.QtWidgets import QGraphicsPixmapItem, QStyleOptionGraphicsItem, QWidget, QGraphicsItem

from util.ImageUtil import MyImage


class ImageWidget(QGraphicsPixmapItem):
    # 影像在横轴偏移量
    w_offset = 0
    # 影像在纵轴的偏移量
    h_offset = 0
    # 鼠标当前所在的像素位置
    w_cur_pos = 0
    h_cur_pos = 0

    def __init__(self, pixmap: QPixmap, signal_pixel_selected):
        super(ImageWidget, self).__init__(pixmap)
        self.pixmap = pixmap
        self.setAcceptDrops(True)
        self.m_scaleValue = 1
        self.m_scaleDafault = 1
        self.m_isMove = False
        self.m_startPos = None
        self.setAcceptHoverEvents(True)
        self.signal_pixel_selected = signal_pixel_selected

    def boundingRect(self):
        self.w_offset = int(self.pixmap.width() / 2)
        self.h_offset = int(self.pixmap.height() / 2)
        return QRectF(-self.w_offset, -self.h_offset,
                      self.pixmap.width(), self.pixmap.height())

    def paint(self, painter: QPainter, const: QStyleOptionGraphicsItem, widget: QWidget):
        self.setOffset(-self.w_offset, -self.h_offset)
        painte
### 使用 QLabel 控件显示图片实现缩放平移 为了在 PyQt 中使用 `QLabel` 显示图片,并支持缩放平移功能,可以按照以下方法构建应用程序: #### 创建主窗口类 定义一个继承自 `QWidget` 的主窗口类,在其中初始化用于展示图像的 `QLabel`。 ```python from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QScrollArea from PyQt5.QtGui import QPixmap import sys class ImageViewer(QWidget): def __init__(self): super().__init__() layout = QVBoxLayout() scroll_area = QScrollArea() label_map = QLabel(self) img = QPixmap('map.jpg') label_map.setPixmap(img) # 设置label内部图片自适应填充 label_map.setScaledContents(True) # 将标签放入滚动区域以便于处理超出屏幕尺寸的大图 scroll_area.setWidget(label_map) scroll_area.setAlignment(Qt.AlignCenter) layout.addWidget(scroll_area) self.setLayout(layout) if __name__ == '__main__': app = QApplication(sys.argv) viewer = ImageViewer() viewer.showMaximized() sys.exit(app.exec_()) ``` 此部分代码创建了一个名为 `ImageViewer` 的窗口部件,它包含一个带有 `QLabel` 的可滚动视窗 (`QScrollArea`) 来承载要查看的图像[^1]。通过调用 `setScaledContents(True)` 方法使图像自动调整大小以适合标签空间[^4]。 #### 添加手势控制逻辑 为了让用户可以通过鼠标滚轮或拖拽来进行放大缩小以及平移操作,则需进一步扩展上述基础结构,加入相应事件处理器。 对于缩放而言,可以在重写 `wheelEvent()` 函数中根据鼠标的上下滚动方向改变当前比例因子;而对于平移来说则是在捕获到按住鼠标按键的同时移动时更新偏移量。 ```python def wheelEvent(self, event): zoom_factor = 1.2 if event.angleDelta().y() > 0 else 0.8 current_scale = self.transform().m11() new_scale = min(max(current_scale * zoom_factor, MIN_ZOOM), MAX_ZOOM) transform = QTransform().scale(new_scale / current_scale, new_scale / current_scale) self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse) self.setTransform(transform) def mousePressEvent(self, event): if event.button() == Qt.LeftButton: self.drag_start_position = event.pos() def mouseMoveEvent(self, event): if not hasattr(self, 'drag_start_position'): return delta = event.pos() - self.drag_start_position self.horizontalScrollBar().setValue(self.horizontalScrollBar().value() - delta.x()) self.verticalScrollBar().setValue(self.verticalScrollBar().value() - delta.y()) self.drag_start_position = event.pos() ``` 这些函数实现了基于鼠标交互的手势识别机制,允许用户轻松地对图像执行缩放平移动作[^3]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZH_CS

随缘吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值