Python pyqt5 数组在 label 中自适应显示或者播放

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

1、label 的一些设置,主要是文本、图片对齐方式设置(居中)
2、视频在 label 中播放,简易视频播放器
3、将读取的灰度数组在 label 上自适应显示或播放
4、图片在 label 上自适应显示


提示:以下是本篇文章正文内容,下面案例可供参考

一、使用步骤

1.Label 的一些设置

使用 pyqt5 设计好窗口后,转为 .py 文件。
对 label 属性的一些修改
代码如下(示例):


# 创建 QLabel
self.FileDisplay = QtWidgets.QLabel(self.CentralWidget)

# 设置 label 位置大小
# QtCore.QRect(xPosition, yPosition, width, height)
self.FileDisplay.setGeometry(QtCore.QRect(20, 140, 640, 512))

# 设置形状最小值
# QtCore.QSize(width, height)
self.FileDisplay.setMinimumSize(QtCore.QSize(640, 512)) 

# -----------------------------------------------------------
# 设置 label 中文本或图片的对其方式
# AlignCenter: 垂直水平居中对齐
# AlignVCenter: 垂直居中
# AlignHCenter: 水平居中
# AlignLeft: 水平方向靠左
# AlignRight: 水平方向靠右
# AlignTop: 垂直方向靠上
# AlignButton: 垂直方向靠下
# AlignJustify: 水平方向调整间距两端对齐
self.FileDisplay.setAlignment(QtCore.Qt.AlignCenter)  
# -----------------------------------------------------------

# 设置现状
self.FileDisplay.setFrameShape(QtWidgets.QFrame.Box)
# 设置初始显示的文字
self.FileDisplay.setText("")
# 控件名称
self.FileDisplay.setObjectName("FileDisplay")

2.视频播放

代码如下(示例):


import cv2
# filepath: 视频文件完整路径
video = cv2.VideoCapture(filepath)
# 获取输入视频的宽度
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 / 1920 (label 宽度)
ratio2 = height / 1080 (label 高度)
ratio = max(ratio1, ratio2)
    
while video.isOpened():
	ret, frame = video.read()
	# 将图片转换为 Qt 格式
	# QImage:QImage(bytes,width,height,format)
	picture = QtGui.QImage(frame.data, width, height, 3*width, QImage.Format_RGB888)       
    pixmap = QPixmap.fromImage(picture)
    # 按照缩放比例自适应 label 显示
    pixmap.setDevicePixelRatio(ratio)
    self.FileDisplay.setPixmap(pixmap)
    cv2.waitKey(10)
    video.release()     # 释放资源
    

2.灰度数组 Label 自适应显示

首先读取 “.tif” | “.tiff” 文件
可以使用 < import tifffile > 这个库读取文件
代码如下(示例):


# ratio: 帧缩放比例
ratio1 = width / 1920 (label 宽度)
ratio2 = height / 1080 (label 高度)
ratio = max(ratio1, ratio2)  

# 将图片转换为 Qt 格式,才能在 label 上显示
# 若是 tif、tiff 灰度图显示
# uint8: format = QImage.Format_Grayscale8
# uint16: format = QImage.Format_Grayscale16
# QImage:QImage(input array,width,height,format)
picture = QtGui.QImage(frame_array.data, width, height, 3*width, QImage.Format_Grayscale8)
pixmap = QPixmap.fromImage(picture)

# 按照缩放比例自适应 label 显示
pixmap.setDevicePixelRatio(ratio)

# 在 label 中显示
self.FileDisplay.setPixmap(pixmap)

format 具体格式看官方文档:
https://www.riverbankcomputing.com/static/Docs/PyQt5/api/qtgui/qimage.html

2. 图片 “.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)


使用PyQt5创建视频显示窗口有多种方法,以下为你介绍不同示例的实现方式: ### 方法一:使用QMediaPlayer和QVideoWidget 此方法可实现指定大小窗口播放视频,示例代码如下: ```python import sys from PyQt5.QtCore import QUrl from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import QMainWindow, QApplication from PyQt5.QtMultimedia import QMediaContent, QMediaPlayer from PyQt5.QtMultimediaWidgets import QVideoWidget class MainWindow(QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.resize(400, 400) self.video_widget = QVideoWidget(self) self.video_widget.resize(200, 200) self.video_player = QMediaPlayer() self.video_player.setMedia(QMediaContent(QUrl.fromLocalFile(r"C:\Users\15025\Desktop\traffic.avi"))) self.video_player.setVolume(40) self.video_player.setVideoOutput(self.video_widget) self.video_player.play() if __name__ == '__main__': app = QApplication(sys.argv) app.setWindowIcon(QIcon('./cat.ico')) form = MainWindow() form.show() sys.exit(app.exec_()) ``` 在上述代码中,首先导入必要的模块,创建`MainWindow`类继承自`QMainWindow`,在其构造函数中设置窗口大小、创建`QVideoWidget`和`QMediaPlayer`对象,设置视频文件路径、音量和输出,最后调用`play`方法播放视频。在主程序中创建应用程序实例、窗口实例并显示窗口,最后进入应用程序的事件循环 [^3]。 ### 方法二:创建QWidget子类进行视频抽帧显示 示例代码如下: ```python import sys from PyQt5.QtWidgets import QWidget, QLabel, QApplication from PyQt5.QtGui import QImage, QPixmap from PyQt5.QtCore import QTimer import cv2 class VideoPlayer(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.label = QLabel(self) self.timer = QTimer(self) self.timer.timeout.connect(self.show_frame) self.cap = cv2.VideoCapture('your_video_file.mp4') self.timer.start(30) def show_frame(self): ret, frame = self.cap.read() if ret: height, width, channel = frame.shape bytesPerLine = 3 * width qImg = QImage(frame.data, width, height, bytesPerLine, QImage.Format_RGB888).rgbSwapped() pixmap = QPixmap.fromImage(qImg) self.label.setPixmap(pixmap) if __name__ == '__main__': app = QApplication(sys.argv) player = VideoPlayer() player.show() sys.exit(app.exec_()) ``` 此方法创建了`VideoPlayer`类继承自`QWidget`,在`initUI`函数中创建`QLabel`用于显示帧,启动`QTimer`循环读取视频帧,在`show_frame`函数中读取帧并转换为`Qt`图像显示在窗口中,最后打开视频流并启动应用程序 [^2]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值