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

【[Qt]基于QGraphicsView的图像显示控件,支持放大、缩小、鼠标拖动】 基于QGraphicsView类的图像显示控件,支持鼠标交互,放大、缩小、移动、复原,支持加载三种类型的图片:QImage、QPixmap、cv::Mat。 阅读详情

在这里只贴出图像的相关代码,基于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)
        painter.drawPixmap(-self.w_offset, -self.h_offset, self.pixmap)

    # 将主界面的控件QGraphicsView的width和height传进本类中,并根据图像的长宽和控件的长宽的比例来使图片缩放到适合控件的大小
    def setQGraphicsViewWH(self, nwidth: int, nheight: int):
        nImgWidth = self.pixmap.width()
        nImgHeight = self.pixmap.height()
        t_width = nwidth * 1.0 / nImgWidth
        t_height = nheight * 1.0 / nImgHeight
        if t_width > t_height:
            self.m_scaleDafault = t_height
        else:
            self.m_scaleDafault = t_width
        self.setScale(self.m_scaleDafault)
        self.m_scaleValue = self.m_scaleDafault

    # 重置图片大小
    def resetItemPos(self):
        #  缩放比例回到一开始的自适应比例
        self.m_scaleValue = self.m_scaleDafault
        # 缩放到一开始的自适应大小
        self.setScale(self.m_scaleDafault)
        self.setPos(0, 0)

    def getScaleValue(self):
        return self.m_scaleValue

    # 鼠标点击事件
    def mousePressEvent(self, event):
        print("鼠标点击事件 x=%d y=%d" % (event.pos().x(), event.pos().y()))
        if event.buttons() == Qt.LeftButton:  # 左键按下
            self.m_startPos = event.pos()
            self.m_isMove = True
        elif event.buttons() == Qt.RightButton:  # 右键按下
            print("单击鼠标右键")
        elif event.buttons() == Qt.MidButton:  # 中键按下
            print("单击鼠标中键")

    '''滚轮滚动事件'''

    def wheelEvent(self, event):
        if event.delta() > 0 and self.m_scaleValue >= 1000:
            return
        elif event.delta() < 0 and self.m_scaleValue <= 0.01:
            return
        else:
            angle = event.delta()
            # 获取当前鼠标相对于view的位置
            pos = event.pos()
            qrealOriginScale = self.m_scaleValue
            if angle > 0:
                self.m_scaleValue *= 1.1
            else:  # 滚轮下滚
                self.m_scaleValue *= 0.9
            self.setScale(self.m_scaleValue)
            # 使图片缩放的效果看起来像是以鼠标所在点为中心进行缩放的
            if angle > 0:
                self.moveBy(-pos.x() * qrealOriginScale * 0.1, -pos.y() * qrealOriginScale * 0.1)
            else:  # 滚轮下滚
                self.moveBy(pos.x() * qrealOriginScale * 0.1, pos.y() * qrealOriginScale * 0.1)

    '''鼠标双击事件(单击)'''

    def mouseDoubleClickEvent(self, event):
        self.resetItemPos()

    '''鼠标键释放事件'''

    def mouseReleaseEvent(self, event):
        self.m_isMove = False

    '''鼠标移动事件'''

    def mouseMoveEvent(self, event):
        if self.m_isMove:
            point: QPoint = (event.pos() - self.m_startPos) * self.m_scaleValue
            self.moveBy(point.x(), point.y())

基于 QGraphicsView 实现图像显示

# 图片显示空间封装
import os

from PyQt5 import QtWidgets
from PyQt5.QtCore import Qt, QSize, QPoint, QRect, QRectF, pyqtSignal
from PyQt5.QtGui import QColor, QPalette, QImage, QPixmap, QMovie
from PyQt5.QtWidgets import QGraphicsView, QGraphicsPixmapItem, QGraphicsScene, QGraphicsItem, QGraphicsTextItem, QLabel

from view.image.ImageWidget import ImageWidget


class ImageLabel(QGraphicsView):
    # 鼠标悬停像素的信号
    signal_pixel_selected = pyqtSignal(str, int)
    item: ImageWidget = None
    pixmap: QPixmap = None

    def __init__(self):
        super(ImageLabel, self).__init__()
        self.QImg = None
        self.image = None
        self.image_array = None
        self.background_color = QColor()
        self.background_color.setNamedColor('#ffffff')
        self.palette = QPalette()
        self.palette.setColor(QPalette.Window, self.background_color)
        self.__init_view()

    def __init_view(self):
        self.setAutoFillBackground(True)
        self.setPalette(self.palette)
        self.setAlignment(Qt.AlignCenter)
        self.v_width = self.width()
        self.v_height = self.height()
        self.scene = QGraphicsScene()  # 创建场景
        self.setSceneRect(QRectF(-(self.v_width / 2), -(self.v_height / 2), self.v_width - 10, self.v_height - 10))
        self.setScene(self.scene)

    # 显示整幅图像
    def showImage(self, image_array):
        self.scene.clear()
        height, width, bytesPerComponent = image_array.shape
        bytesPerLine = bytesPerComponent * width
        if bytesPerComponent == 1:
            # 显示灰度图像
            self.QImg = QImage(image_array.tobytes(), width, height, bytesPerLine, QImage.Format_Grayscale8)
        elif bytesPerComponent == 3:
            # 显示GGB图像
            self.QImg = QImage(image_array.tobytes(), width, height, bytesPerLine, QImage.Format_RGB888)
        else:
            # 如果不符合就不显示
            return
        self.pixmap = QPixmap.fromImage(self.QImg)
        self.item = ImageWidget(self.pixmap, self.image, self.signal_pixel_selected)
        self.item.setQGraphicsViewWH(self.v_width, self.v_height)
        self.scene.addItem(self.item)

完整代码:

pythonpyqt5实现图片浏览_pyqt5显示图片-教育文档类资源-优快云下载包括图片缩放,平移,分图层显示pyqt5显示图片更多下载资源、学习资料请访问优快云下载频道.https://download.youkuaiyun.com/download/ZH_CS/13990943

PyQt5图片显示:用QGraphicsView替代QLabel实现缩放与交互 GUI开发中,图片显示是常见需求。PyQt5提供了多种实现路径,其中QGraphicsView作为图形视图框架的核心组件,通过场景、视图、图元三层结构有效管理图像及交互。与QLabel的简单贴图相比,QGraphicsView支持坐标变换、自适应缩放、滚轮缩放和拖拽平移,在图像查看器、标注工具等场景中优势明显。从文件选择、路径处理到场景设置、图元替换,本文梳理了完整的数据流,并给出代码骨架与踩坑经验,帮助开发者快速实现稳定流畅的图片显示与交互功能。 阅读详情

相关推荐

医用超声图像模拟系统:界面详细设计代码详解

医用超声图像模拟系统是医学影像教学、算法研发和设备测试的重要工具。一个直观、高效且专业的用户界面(UI)是此类系统成功的关键。本文将详细探讨一个医用超声图像模拟系统的界面详细设计,并提供核心的代码实现,涵盖布局、控件、图像显示、参数调节及交互逻辑等关键模块。为了实现流畅的用户体验,参数控件的变化应能实时反馈到图像显示。我们可以使用信号与槽机制,并将耗时的图像生成放在单独的线程中。中央显示区域除了显示图像,还应支持常见的医学影像交互,如缩放、平移、窗宽窗位调节(WW/WL)以及测量。

alxraves的博客 446

实战PyQt5: 158-QChart图表之线条缩放显示

在数据量比较的折线图或者曲线图,受图表本身显示区域大小的限制,不能精细地显示某一小块区域的数据变化,QChartView提供了方法setRubberBand()可以实现一种类似放大镜的功能,可以将局部区域的数据放大到整个图表显示区域中显示。这样就可以方便地实现在图表中对图形序列的局部放大观察。...

seniorwizard的专栏 4048

用PyQt5与PyQtGraph流畅展示超大遥感影像的实践指南

在处理遥感影像、病理切片等超大图像时,常见的QLabel+QPixmap方案常因内存占用过高而卡顿甚至崩溃。PyQtGraph作为基于NumPy的高性能绘图库,通过ImageItem按视口动态绘制、ViewBox管理缩放平移,能高效支撑数百MB甚至GB级影像的流畅交互。结合PyQt5构建界面骨架,再配合分位拉伸、levels显式设置、金字塔与异步加载等优化手段,可解决SAR影像float32数据、NaN异常值以及多波段通道顺序等工程难题。本文从原理到实践,系统讲解如何构建稳定、顺滑的超大影像浏览工具,帮助开

weixin_42593701的博客 76

pyqt5 分割瓦片显示超大图像

基于QGraphicsItem实现超大影像分片显示,可以范围选取,获取像素点信息,缩放平移

ZH_CS的博客 2506

Qt实现无边框窗口平移缩放项目实战

在现代图形界面开发中,传统的标准窗口样式已经难以满足日益增长的视觉与交互需求。特别是在桌面应用设计中,无边框窗口与自定义样式成为提升用户体验的重要手段。Qt 提供了强大的机制支持开发者实现高度定制的窗口样式,包括使用 QSS(Qt Style Sheets)、QPainter 绘图以及跨平台适配等技术。本章将围绕自定义窗口的设计原理展开,深入探讨如何通过 Qt 提供的工具实现视觉与交互层面的自定义窗口设计。

weixin_30299319的博客 1128

PyQt5 + pyqtgraph 实现超大遥感影像流畅缩放平移的实战指南

在桌面影像浏览工具开发中,超大图片或遥感影像的加载与交互性能是常见瓶颈。传统 QLabel、QGraphicsView 在处理数亿像素数据时往往卡顿、白屏频发。pyqtgraph 作为高性能的科学绘图库,通过 ImageItem 按需刷新与 ViewBox 坐标矩阵变换,大幅降低重绘开销,实现流畅缩放与平移。理解其显示链路原理后,开发者可结合 PyQt5 构建影像查看器,并针对 16bit 遥感影像、SAR 幅度数据等场景,使用灰度拉伸、对数压缩、伪彩色映射与地理坐标变换完成专业展示。本文还总结了内存占用、

weixin_35706067的博客 203

PyQt5图像显示进阶:从QLabel到QGraphicsView的完整实践指南

在桌面应用开发中,图像显示与交互是高频需求。初学者常从QLabel展示静态图片入手,但当涉及大图缩放、局部拖拽、图元标注等画布式交互时,QLabel的局限便暴露无遗。QGraphicsView作为Qt提供的图形视图框架,通过场景(Scene)、视图(View)与图元(Item)的协作,天然支持坐标变换、缩放平移与事件分发,成为构建图像标注工具、流程图编辑器及地图查看器的理想选择。本文从基础概念出发,剖析GraphicsView的核心原理,对比QLabel、QScrollArea的适用边界,并通过PyQt5示

weixin_42619061的博客 214

PyQtGraph助力PyQt5超大影像显示:遥感与SAR影像流畅缩放平移实践

在遥感与SAR影像处理中,超大尺寸图像的流畅显示一直是工程痛点。传统基于QGraphicsView与QPixmap的方案,在加载数千乘数千像素的图像时往往面临解码缓慢、内存膨胀、交互卡顿等问题。PyQtGraph作为一款高性能的科学绘图库,通过OpenGL纹理映射与自动降采样机制,将图像渲染压力从CPU转移到GPU,实现了大图的近零拷贝上传与实时重采样,从根本上解决了渲染性能瓶颈。其核心组件ViewBox支持灵活的缩放、平移与坐标映射,配合levels参数合理设置,可有效应对遥感影像动态范围大、SAR复数数

weixin_28740299的博客 116

PyQt5开发小工具:利用鼠标滚轮和移动事件,5分钟实现一个图片缩放查看器

本文详细介绍了如何使用PyQt5快速开发一个支持鼠标滚轮缩放和拖拽平移的高交互图片查看器。通过核心事件处理和简单数学计算,开发者可以在5分钟内构建一个专业级的图片浏览器,适用于各种桌面应用场景。文章包含完整的代码实现和优化技巧,特别适合Python开发者快速开发内部工具。

weixin_33725126的博客 353

pyqt5 pyqtgraph 实现超大图片、遥感影像、SAR影像展示、缩放、平移

在使用pyqt5显示超大遥感影像时,程序卡顿特别严重,遂实现了一种思路,将影像分割成较小的瓦片,然后循环显示到QGraphicsItem中,同时在分片的基础上实现了影像的缩放、平移、范围选取和点选取。 可以展示普通图片、遥感影像、SAR影像等,可以选择图层,实现了若干图像质量评价工具

PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形

主要介绍了PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

PyQt5 GraphicsView 图像交互全解析:从QLabel到场景视图图元架构

在Qt图形界面开发中,图形视图框架是一套高性能的场景化管理机制,它通过场景、视图、图元三层架构,将对象绘制、坐标变换与事件交互解耦。不同于QLabel只能静态展示图像,这套体系支持任意缩放、平移、旋转和叠加标注,广泛应用于看图工具、图像标注编辑器、地图预览等需要丰富交互的桌面应用。文章围绕PyQt5中GraphicsView显示图片的完整路径,梳理QGraphicsScene、QGraphicsPixmapItem等核心类的协作关系,讲解锚点缩放、拖拽平移、渲染质量及大图性能优化的工程实践,并总结常见问题排

weixin_33901926的博客 212

君正T31x metartc集成测试

metartc为国内杨大侠部分开源的一款用于嵌入式领域webrtc库,它与谷歌官方webrtc相比,编译到君正平台的可执行文件仅有5M即可实现webrtc的通信。1. 目前实现的是基于开源版v5.0-b0版本做的简单修改,官方的好几个版本都多少缺点东西,我这里给整理了一下。目前是局域网连接的webrtc,后续尝试走stun和turn试一下NAT穿越的效果。

fsmpeg的博客 3159

《OpenCv视觉之眼》Python图像处理二十三:OpenCV图像处理最终章之基于PyQt5的图像处理界面设计及功能实现

本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的、不同方法的处理,以达到对图像进行去噪、锐化等一系列的操作。同时,希望观看本专栏的小伙伴可以理解到OpenCv进行图像处理的强大哦,如有转载,请注明出处(原文链接和作者署名),感谢各位小伙伴啦! 前文参考: 《OpenCv视觉之眼》Python图像处理一 :Opencv-python的简介及Python环境搭建 《OpenCv视觉之眼》Python图像

qq_42451251的博客 5797

Android Camera Sensor HDR详解

本文详细介绍了Android相机传感器(Sensor)中实现高动态范围(HDR)采集的各种技术方式。主要内容包括: Sensor HDR技术分类 帧内HDR(Single-Frame HDR):在同一帧同一像素内完成多增益采集,无运动伪影和帧率损失,包括DAG(双模拟增益)、DCG(双转换增益)等技术 帧间HDR(Multi-Frame HDR):通过多帧曝光实现,如DOL(数字重叠)、Staggered HDR等 混合HDR:结合多种技术的复合方案 详细技术原理 重点解析了DAG和DCG两种主流帧内HDR

DU_YULIN的博客 361

别再写前端了!用Gradio 3.x + HuggingFace Spaces,5分钟把你的Python算法变成网页应用

本文介绍如何利用Gradio 3.x和HuggingFace Spaces快速将Python算法转化为网页应用,无需前端开发经验。通过5行代码和简单的Git命令,即可实现专业级Web界面部署,大幅提升算法展示效率。特别适合算法工程师和数据科学家快速分享模型成果。

weixin_33443333的博客 332

界面开发(5)--- PyQt5实现图像缩放与视频进度控制功能

本文详细介绍了如何使用PyQt5为媒体查看器添加图像缩放与视频进度控制功能。通过QGraphicsView体系实现流畅的图片缩放与拖拽,并利用QSlider和QTimer实现精准的视频进度控制与时间显示,有效提升了应用的专业性和用户体验。

xray4的博客 635

若依开源框架(分离版)在人大金仓数据库下使用

对于甲方业务特殊要求,使用国产化数据库人大金仓,作为项目主要存储。这里以若依开源框架整合人大金仓为例,演示如何在真实项目中引入人大金仓。

🐱喵测实验室 5942

pyqt实现图片滚轮缩放大小

pyqt实现图片滚轮缩放大小

summerriver1的博客 1255

windows11 远程桌面连接 通过代理连接RDP桌面报错 错误代码0x904 拓展错误代码0x7

打开windows Defender防火墙设置--允许应用通过防火墙更改设置--允许其他应用浏览--进入C:\WINDOWS\system32目录选择mstsc.exe进入C:\Windows\SysWOW64目录h'qmstsc.exe添加后列表里多了一个远程桌面连接,还有一个Remote Desktop Connection,配置网络权限后保存连接成功。

weixin_43978891的博客 1万+

Cesium中实现阴影率分析

看到群里有人在研究这个,所以看了一下。主要是模仿超图的,实现原理超图有做回答:但其实超图的这个实现方式还是过于复杂,原因是:既然是获取太阳的日照阴影,而Cesium中原本就存在太阳,且能投射阴影,因此其实并不需要再次计算太阳位置并计算视锥获取深度图,直接使用Cesium原生的太阳深度图即可。

weixin_43481439的博客 2217

重写QLabel类,使QLabel显示的图片可以随鼠标滚轮缩放、随鼠标左键拖动

(3)在 提升的类名称 和 头文件 两栏中填写MyLabel,依次点击添加和提升,在右侧的对象查看器中可以看到该label对象已经属于自定义的MyLabel类;代码自定义了一个继承QLabel类的子类MyLabel,用于显示图像并实现图像交互功能,通过鼠标拖动和滚轮操作,可以实现图像的平移和缩放,提升用户交互体验。(4)为了防止label大小随图片的大小进行变化,在右侧属性编辑器中将label的sizePolicy水平策略和垂直策略均选择Ignored;

Kirito________的博客 1785

扣子Coze智能体万字教程:从入门到精通,一文掌握AI工作流搭建

智能体 = 角色设定 + 提示词 + 变量输入一个好提示词的核心是结构、风格和复用性创建后可以一键发布成网页应用、对话助手整个过程0代码,只靠配置,人人可学,人人可用四、进阶一:理解「工作流」的威力如果你已经用扣子创建了几个简单的智能体,比如写个爆款小红书文案、生成一段短视频脚本,那恭喜你已经入门。但如果你还停留在“一个智能体 = 一段提示词”的层级,你离真正的智能体生产力革命,还差一步:学会搭建“工作流”——让多个大模型自动协同完成任务。

互联网架构师笔记 3508

[pyqt5]窗口放大缩小图片后让图片某个矩形区域绘制跟随同步缩放

main.py和shape.py处于同一个目录即可。

FL1623863129的博客 1080

APM32取代STM32的经验分享

我仔细检查了代码中与硬件相关的部分,例如外设寄存器的访问和中断处理程序的设置,并进行了相应的修改。在本文中,我将分享我将APM32引入项目中取代STM32的经验,并提供相应的源代码。我查看了APM32的官方网站、开发者论坛和相关社交媒体,了解了开发者社区的活跃度和可用的资源。总结起来,将APM32替换STM32的过程需要经过几个关键步骤:了解APM32的规格和功能、评估软件生态系统、迁移代码和调试,以及性能和功耗优化。在开始替换之前,我对APM32进行了详细的研究和评估,以确保它能够满足项目的需求。

UplKubernetes的博客 2004

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

pyqt5以鼠标为中心,滚动鼠标对图片进行缩放

一、注意Item、Scene、View各自含义 在对图片进行缩放的时候,注意缩放的应该是Item,是图元,而不是Scene或者View。 所以当为了满足以鼠标为中心放大,而需要进行平移时,移动的是图元,图元才是可移动的。同时需要注意moveBy函数的含义,它移动的距离指的是相对item左上角移动距离,原始值为(0,0),向上向右移动为负数。 二、下面举例代码 创建了QgraphicsPixmapItemNew类,继承自QgraphicsPixmapItem,重构了鼠标滚动事件,完整代码如下 fr

JYH_TY的博客 3157

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

上一篇: mysql 主从同步时忽略指定的表
下一篇: centos 7 修改kubelet工作目录
ZH_CS
博客等级 码龄15年 6粉丝 19原创
评论 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、付费专栏及课程。

余额充值