date: 2022-11-30 14:23 status: public title: ‘pyqt 显示图片的若干方法’
单张图片
使用lable 显示图片
特点是最简单,但功能也最少。
![](https://img-blog.csdnimg.cn/img_convert/3bea2a9ab1e8603b7e0271e20fa4163d.png)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QLabel
class ImageLabel(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.resize(600, 400)
self.setWindowTitle("label image")
pix = QPixmap(r'C:\fruits.jpg')
label = QLabel(self)
label.setPixmap(pix)
label.setScaledContents(True) # 自适应QLabel大小
layout = QVBoxLayout()
layout.addWidget(label)
self.setLayout(layout)
if __name__ == '__main__':
app = QApplication(sys.argv)
mainWidget = ImageLabel()
mainWidget.show()
sys.exit(app.exec_())
使用pyqtgraph 控件显示图片
来源 【PyQtGraph】显示图像 特点 可以对图片进行缩放操作,继承了pyqtgraph 的一些特点功能。
![](https://img-blog.csdnimg.cn/img_convert/6cc8a9caec5599f86bdb977a264729d6.gif)
"""
安装依赖库:
1. Pillow
2. PySide2
3. PyQtGraph
from https://blog.csdn.net/zhy29563/article/details/119754910
"""
import sys
import numpy as np
import pyqtgraph as pg
from PIL import Image
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QPushButton, QWidget, QFileDialog
from pyqtgraph import ImageView
# 设置 PyQtGraph 显示配置
########################################################################################################################
# 设置显示背景色为白色,默认为黑色
pg.setConfigOption('background', 'w')
# 设置显示前景色为黑色,默认为灰色
pg.setConfigOption('foreground', 'k')
# 设置图像显示以行为主,默认以列为主
pg.setConfigOption('imageAxisOrder', 'row-major')
class PyQtGraphicDemo(QWidget):
def __init__(self, parent=None):
super(PyQtGraphicDemo, self).__init__(parent)
self.resize(600, 400)
# 图像显示控件
self.graphicsView = ImageView(self)
# 隐藏直方图,菜单按钮,ROI
self.graphicsView.ui.histogram.hide()
self.graphicsView.ui.menuBtn.hide()
self.graphicsView.ui.roiBtn.hide()
image = Image.open(r'C:\fruits.jpg')
if image is not None:
# 如果之前未设置显示选项以行为主,这里需要对显示图像进行转置
self.graphicsView.setImage(np.array(image))
self.verticalLayout = QVBoxLayout(self)
self.verticalLayout.addWidget(self.graphicsView)
# 设置窗口布局
self.setLayout(self.verticalLayout)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = PyQtGraphicDemo()
window.show()
sys.exit(app.exec_())
多张图片
使用scrollArea 显示多张图片
来源:PyQt5-使用scrollArea实现图片查看器功能
特点是当窗口大小小于scrollArea 区域大小时有滑动条显示,可以拖动滑动条滑动界面。
但是这份代码有个缺点,就是当窗口大小大于scrollArea 区域大小时,你会发现scrollArea 以外的区域是空白的,也就是scrollArea 是固定大小的,区域外不会显示内容。注释掉 self.setFixedSize(850, 600) 可以测试看到。 这份代码的显示原理大致如下:创建一个scrollArea控件,对多张图像依次执行下面循环的操作:1. 创建一个label 显示image;2. label 添加到 一个QVBoxLayout 中,3. QVBoxLayout 作为一个临时的QWidget layout,4. 移动这个临时的 QWidget 到指定坐标。emmm 就不是很优雅。
![](https://img-blog.csdnimg.cn/img_convert/3da376d81db49a707ef6413417419f6a.gif)
# from https://blog.csdn.net/HG0724/article/details/116702824
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.uic import loadUi
class Picture(QMainWindow):
def __init__(self, parent=None, url=None):
super().__init__(parent)
self.url = url
self.ui()
def ui(self):
loadUi('./show_pic.ui', self)
# self.setFixedSize(850, 600)
total = len(self.url)
self.qw = QWidget()
if total % 5 == 0:
rows = int(total / 5)
else:
rows = int(total / 5) + 1
self.qw.setMinimumSize(850, 230 * rows)
for i in range(total):
photo = QPixmap(self.url[i])
# print('photo:',photo)
# photo.loadFromData(req.content)
width = photo.width()
height = photo.height()
print('width:', width, ' ', 'height:', height)
if width == 0 or height == 0:
continue
tmp_image = photo.toImage() # 将QPixmap对象转换为QImage对象
size = QSize(width, height)
# photo.convertFromImage(tmp_image.scaled(size, Qt.IgnoreAspectRatio))
photo = photo.fromImage(tmp_image.scaled(size, Qt.IgnoreAspectRatio))
# 为每个图片设置QLabel容器
label = QLabel()
label.setFixedSize(150, 200)
label.setStyleSheet("border:1px solid gray")
label.setPixmap(photo)
label.setScaledContents(True) # 图像自适应窗口大小
vl = QVBoxLayout()
vl.addWidget(label)
tmp = QWidget(self.qw)
tmp.setLayout(vl)
tmp.move(160 * (i % 5), 230 * int(i / 5))
self.scrollArea.setWidget(self.qw) # 和ui文件中名字相同
if __name__ == '__main__':
app = QApplication(sys.argv)
# 这是我的文件夹中图片的路径
import glob
url = glob.glob(r"C:\waDump\*.jpg")
pic = Picture(url=url)
pic.show()
sys.exit(app.exec_())
使用scrollArea + gridLayout 显示多张图片
可以缩放窗口,图像可以随着窗口变化,但只是图像间距拉伸,每行的图片数量没有变化
![](https://img-blog.csdnimg.cn/img_convert/bd5712cad92b23f5a3107d05d6be9917.gif)
# -*- coding: utf-8 -*-
import glob
import time
from PyQt5 import QtWidgets
from PyQt5.QtCore import QSize, Qt
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QApplication, QLabel, QGridLayout
class Picture(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Picture, self).__init__(parent)
print('Picture init')
self.setWindowTitle('All Images')
self.resize(800, 600)
# ui components
self.scrollArea = QtWidgets.QScrollArea()
self.scrollArea.setWidgetResizable(True)
self.scrollAreaWidgetContents = QtWidgets.QWidget()
# self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
self.scrollArea.setWidget(self.scrollAreaWidgetContents)
self.gridLayout = QGridLayout(self.scrollAreaWidgetContents)
self.v_layout = QtWidgets.QVBoxLayout(self)
self.v_layout.addWidget(self.scrollArea)
self.setLayout(self.v_layout)
# vars
self.max_columns = 5
def load_images(self, paths):
print('load images --start')
total = len(paths)
col = 0
row = 0
for i in range(total):
self.max_columns = total if total 0:
# 打开新窗口显示单张图片
# self.single_image = SingleImageView(image=img_path, background=Qt.white)
# self.single_image.show()
pass
pass
def load_images(self, paths):
for i in range(len(paths)):
img_item = ImageQListWidgetItem("dump image ***", paths[i])
self.addItem(img_item)
self.setItemWidget(img_item, img_item.widget)
# 刷新界面
QApplication.processEvents()
# 自定义的item 继承自QListWidgetItem
class ImageQListWidgetItem(QListWidgetItem):
def __init__(self, name, img_path):
super().__init__()
self.img_path = img_path
# 自定义item中的widget 用来显示自定义的内容
self.widget = QWidget()
# 用来显示name
self.nameLabel = QLabel()
self.nameLabel.setText(name)
# 用来显示avator(图像)
self.avatorLabel = QLabel()
# 设置图像源 和 图像大小
img_obg = QPixmap(img_path)
width = img_obg.width()
height = img_obg.height()
scale_size = QSize(200, 150)
if width |