PyQt5组件之QLabel显示图像和视频

news2024/11/24 6:39:38

目录

一、显示图像和视频

1、显示图像 

2、显示视频

二、QtDesigner 窗口简单介绍

三、相关函数

1、打开本地图片

2、保存图片到本地

3、打开文件夹

4、打开本地文本文件并显示

5、保存文本到本地

6、关联函数

7、图片 “.png” | “.jpn” Label 自适应显示


一、显示图像和视频

1、显示图像 

  • 按路径显示
from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.QtCore import Qt

app = QtWidgets.QApplication([])
label = QtWidgets.QLabel()
label.setGeometry(QtCore.QRect(100, 180, 500, 500))

pixmap = QtGui.QPixmap(r"Angry.png") # 创建相应的QPixmap对象
label.setPixmap(pixmap) # 显示图像
label.setAlignment(Qt.AlignCenter) # 图像居中

label.show()
app.exec()
  • 显示numpy数组
from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.QtCore import Qt
import numpy as np

app = QtWidgets.QApplication([])
label = QtWidgets.QLabel()
label.setGeometry(QtCore.QRect(100, 180, 500, 500))

img = np.random.random((500,500,3))
height, width, depth = img.shape
# 关键代码
image = QtGui.QImage(img, width, height,  QtGui.QImage.Format_RGB888) # 如果没有depth*width,图像可能会扭曲
pixmap = QtGui.QPixmap(image) # 创建相应的QPixmap对象
label.setPixmap(pixmap) # 显示图像
label.setAlignment(Qt.AlignCenter) # 图像居中

label.show()
app.exec()

2、显示视频

  • 按路径
from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.QtCore import Qt
import cv2

app = QtWidgets.QApplication([])
label = QtWidgets.QLabel()
label.setGeometry(QtCore.QRect(100, 180, 500, 500))

video = cv2.VideoCapture(r"G:\00 讲解用\C3D\C3D\Pytorch_C3D_Feature_Extractor-master\data\miayuan\videos\1\1.mp4")
# 获取输入视频的宽度
width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
# 获取输入视频的高度
height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 获取视频帧数
frame_number = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
# 获取输入视频的帧率
frame_rate = int(video.get(cv2.CAP_PROP_FPS))

ratio1 = width / 500 # (label 宽度)
ratio2 = height / 500 # (label 高度)
ratio = max(ratio1, ratio2)

while video.isOpened():
    ret, frame = video.read()
    # 将图片转换为 Qt 格式
    # QImage:QImage(bytes,width,height,format)
    picture = QtGui.QImage(frame, width, height, 3 * width, QtGui.QImage.Format_RGB888)
    pixmap = QtGui.QPixmap.fromImage(picture)
    # 按照缩放比例自适应 label 显示
    pixmap.setDevicePixelRatio(ratio)
    label.setPixmap(pixmap)
    label.show()
    cv2.waitKey(10)

video.release()  # 释放资源
app.exec()
  •  调用摄像头
from PyQt5 import QtWidgets, QtGui, QtCore
import cv2

app = QtWidgets.QApplication([])
label = QtWidgets.QLabel()
label.setGeometry(QtCore.QRect(100, 180, 500, 500))

# 更改改代码即可
video = cv2.VideoCapture(0)
# 获取输入视频的宽度
width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
# 获取输入视频的高度
height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 获取视频帧数
frame_number = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
# 获取输入视频的帧率
frame_rate = int(video.get(cv2.CAP_PROP_FPS))

ratio1 = width / 500 # (label 宽度)
ratio2 = height / 500 # (label 高度)
ratio = max(ratio1, ratio2)

while video.isOpened():
    ret, frame = video.read()
    # 将图片转换为 Qt 格式
    # QImage:QImage(bytes,width,height,format)
    picture = QtGui.QImage(frame, width, height, 3 * width, QtGui.QImage.Format_RGB888)
    pixmap = QtGui.QPixmap.fromImage(picture)
    # 按照缩放比例自适应 label 显示
    pixmap.setDevicePixelRatio(ratio)
    label.setPixmap(pixmap)
    label.show()
    cv2.waitKey(10)

video.release()  # 释放资源
app.exec()

二、QtDesigner 窗口简单介绍

三、相关函数

1、打开本地图片

# 选择本地图片上传
def openImage(self):
   global imgNamepath  # 这里为了方便别的地方引用图片路径,将其设置为全局变量
 
   # 弹出一个文件选择框,第一个返回值imgName记录选中的文件路径+文件名,第二个返回值imgType记录文件的类型
   # QFileDialog就是系统对话框的那个类第一个参数是上下文,第二个参数是弹框的名字,第三个参数是默认打开的路径,第四个参数是需要的格式
   
   imgNamepath, imgType = QFileDialog.getOpenFileName(self.centralwidget, "选择图片",
                                                       "D:\\","*.jpg;;*.png;;All Files(*)")
   # 通过文件路径获取图片文件,并设置图片长宽为label控件的长、宽
   img = QtGui.QPixmap(imgNamepath).scaled(self.label_3.width(), self.label_3.height())
   
   # 在label控件上显示选择的图片
   self.label_3.setPixmap(img)
   
   # 显示所选图片的路径
   self.lineEdit_3.setText(imgNamepath)

2、保存图片到本地

  • (1)保存图片到本地的第一种方式:首先把图片所在label控件截图,然后打开一个保存文件的弹出框,最后保存截图到选中的路径。
def saveImage(self):
    screen = QApplication.primaryScreen()
    pix = screen.grabWindow(self.label_4.winId())
    fpath, ftype = QFileDialog.getSaveFileName(self.centralwidget, "保存图片", "d:\\", "*.jpg;;*.png;;All Files(*)")
    pix.save(fpath)
  • (2)保存图片到本地的第二种方式:首先提取相对应Qlabel中的图片,然后打开一个保存文件的弹出框,最后保存图片到选中的路径。
def saveImage(self):
    # 提取Qlabel中的图片
    img = self.label_4.pixmap().toImage()
    fpath, ftype = QFileDialog.getSaveFileName(self.centralwidget, "保存图片", "d:\\", "*.jpg;;*.png;;All Files(*)")
    img.save(fpath)

3、打开文件夹

# 打开文件夹(目录)
def openDirectory(self):
    fd = QFileDialog.getExistingDirectory(self.centralwidget, "选择文件夹", "")
 
    # 这里的label_directoryPath要根据项目替换成自己的组件
    self.label_directoryPath.setText(fd)   

4、打开本地文本文件并显示

# 选择文本文件上传
    def openTextFile(self):  # 选择文本文件上传
    fd, fp = QFileDialog.getOpenFileName(self.centralwidget, "选择文件", "d:\\", "*.txt;;All Files(*)")
    f = open(fd, 'r')
    self.label_txt.setText(f.read())
    self.label_filePath.setText(fd)
    f.close()

5、保存文本到本地

# 保存文本文件
    def saveTextFile(self):
    fd, fp = QFileDialog.getSaveFileName(self.centralwidget, "保存文件", "d:\\", "*.txt;;All Files(*)")
    f = open(fd, 'w')
    f.write(self.label_txt.text())
    f.close()

6、关联函数

# 按钮关联函数
self.pushButton_2.clicked.connect(self.openImage)
self.pushButton_3.clicked.connect(self.startAction)
self.pushButton_4.clicked.connect(self.saveImage)

7、图片 “.png” | “.jpn” Label 自适应显示


# filepath: 文件完整路径
pixmap = QPixmap(filepath)
ratio1 = pixmap.width() / 1920 (label 宽度)
ratio2 = pixmap.height() / 1080 (label 高度)
ration = max(ratio1, ratio2)
pixmap.setDevicePixelRatio(ration)
self.FileDisplay.setPixmap(pixmap)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/871294.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ 之 线性插值 贝塞尔曲线 非线性动画

非线性动画在程序,游戏和动画中运用非常广泛,那么我们应该如何实现? 非线性动画上的点在s-t图像上非线性,即不为一次函数,实则为处处连续的曲线 对于此曲线可模拟,这里我们用贝塞尔曲线 一,基本…

Azure DevOps基于 Net6.0 的 WPF 程序如何进行持续集成、持续编译

正文 1, Azure DevOps 创建项目 Project name:”NetCore_WPF_Sample“ Visibility:”Private“(根据实际项目需求) Version control:”Git“ Work item process:”Agile“ 点击 ”Create“…

【linux】2 软件管理器yum和编辑器vim

目录 1. linux软件包管理器yum 1.1 什么是软件包 1.2 关于rzsz 1.3 注意事项 1.4 查看软件包 1.5 如何安装、卸载软件 1.6 centos 7设置成国内yum源 2. linux开发工具-Linux编辑器-vim使用 2.1 vim的基本概念 2.2 vim的基本操作 2.3 vim正常模式命令集 2.4 vim末行…

【设计模式】MVC 模式

MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。 Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。View&#xff…

【爬虫】爬取旅行评论和评分

以马蜂窝“普达措国家公园”为例,其评论高达3000多条,但这3000多条并非是完全向用户展示的,向用户展示的只有5页,数了一下每页15条评论,也就是75条评论,有点太少了吧! 因此想了个办法尽可能多爬…

Linux 终端命令之文件浏览(2) more

Linux 文件浏览命令 cat, more, less, head, tail,此五个文件浏览类的命令皆为外部命令。 hannHannYang:~$ which cat /usr/bin/cat hannHannYang:~$ which more /usr/bin/more hannHannYang:~$ which less /usr/bin/less hannHannYang:~$ which head /usr/bin/he…

最新智能AI系统+ChatGPT源码搭建部署详细教程+知识库+附程序源码

近期有网友问宝塔如何搭建部署AI创作ChatGPT,小编这里写一个详细图文教程吧。 使用Nestjs和Vue3框架技术,持续集成AI能力到AIGC系统! 增加手机端签到功能、优化后台总计绘画数量逻辑!新增 MJ 官方图片重新生成指令功能同步官方 …

nginx负载均衡配置过程

一、环境说明 主机名IPnginx服务器nginx-server192.168.198.141web页面1web1192.168.198.100web页面2web2192.168.198.200 关闭所有主机的防火墙和Selinux服务 二、配置过程 自定义页面 自定义web1和web2的页面 主配置文件 查看nginx的主配置文件 vim /usr/local/nginx/c…

全球八分之一的河流受到缺氧影响

一项全球研究发现,世界各地河流中的溶解氧含量低得危险。缺氧的真实发生率可能更高。 小型、低梯度的城市河流,例如图中北卡罗来纳州的那条河流,是最容易缺氧的河流之一。图片来源:乔安娜布拉扎克 2023 年 3 月,《卫报…

LeetCode--HOT100题(29)

目录 题目描述:19. 删除链表的倒数第 N 个结点(中等)题目接口解题思路代码 PS: 题目描述:19. 删除链表的倒数第 N 个结点(中等) 给你一个链表,删除链表的倒数第 n 个结点,并且返回链…

Microsoft365家庭版1年订阅新功能及版本对比

Microsoft 365可帮助您工作、学习、组织、连接和创,只需一项方便的订阅,即可尽享具有 Microsft 365 的6款精品应用、可同时登录5 台设备(包括 Windows、macOS、iOS 和 Android 设备)、高级安全性等,并且可以自由管理授…

升级STM32电机PID速度闭环编程:从F1到F4的移植技巧与实例解析

引言: 在嵌入式系统开发中,STM32系列微控制器广泛应用于各种应用领域。而对于直流有刷电机的控制,PID速度闭环是一种常用的控制方式。本文将以此为例,探讨如何从STM32F1系列移植到STM32F4系列,并详细介绍HAL库在不同型…

渗透测试验证码爆破实操

一、准备工具 captcha-killer-modified 下载路径 https://github.com/f0ng/captcha-killer-modified https://github.com/f0ng/captcha-killer-modified/releases/download/0.21-beta/captcha-killer-modified-0.21-beta-jdk11.jar 二、安装工具 burp安装captcha-killer-modif…

登录验证码实现

Hutool代码改造 Hutool 有参考文档&#xff1b;很多工具类&#xff1b;把一些功能都封装好&#xff1b;都不用你自己去写&#xff1b;直接调用它的工具类 它这里会详细告诉你引入方式Hutool <dependency><groupId>cn.hutool</groupId><artifactId>hu…

【第二阶段】kotlin语言的内联-inline关键字

1.函数如果没有使用lambda作为参数&#xff0c;就不需要声明成内联 2.函数如果使用lambda作为参数&#xff0c;就需要声明成内联&#xff0c;如果不使用内联&#xff0c;在调用端会生成多个对象来完成lambda的调用&#xff0c;会造成性能的损耗 3.函数如果使用lambda作为参数&a…

模板Plus【完整版】

文章目录 1.非类型模板参数的引入2.标准库和普通数组3.模板的特化3.1介绍3.2代码讲解3.3画图讲解 4.类、函数模板特化初识5.全特化与偏特化6.模板不能分离编译1.typename的使用2.预处理相关知识3.为什么不能分离编译&#xff1f;4.怎么解决&#xff1f;5.代码详解1.vector.h2.v…

实战篇之基于二进制思想的用户标签系统(Mysql+SpringBoot)

一&#xff1a; 计算机中的二进制 计算机以二进制表示数据&#xff0c;以表示电路中的正反。在二进制下&#xff0c;一个位只有 0 和 1 。逢二进一 位。类似十进制下&#xff0c;一个位只有 0~9 。逢十进一位。 二&#xff1a; 进制常用运算 &#xff08;位运算&#xff09;…

QT之时钟

QT之时钟 会用到一个时间类:qtime 定时类:qtimer #------------------------------------------------- # # Project created by QtCreator 2023-08-13T10:49:31 # #-------------------------------------------------QT += core guigreaterThan(QT_MAJOR_VERSION,…

基于Yolov8与LabelImg训练自己数据的完整流程

基于Yolov8与LabelImg训练自己数据的完整流程 1. 创建虚拟环境2. 通过git 安装 ultralytics3. 安装完成之后&#xff0c;通过以下代码测试下环境配置是否正确4. 安装labelImg标注软件5. 使用labelImg进行标注&#xff0c;图片使用上面的coco1285.1 点击“打开目录”选择存储图像…