我的编程空间,编程开发者的网络收藏夹
学习永远不晚

pyqt 显示图片的若干方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

pyqt 显示图片的若干方法


date: 2022-11-30 14:23
status: public
title: ‘pyqt 显示图片的若干方法’


单张图片

使用lable 显示图片

特点是最简单,但功能也最少。

#!/usr/bin/env python# -*- coding: utf-8 -*-import sysfrom PyQt5.QtGui import QPixmapfrom PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QLabelclass 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 的一些特点功能。

"""安装依赖库:1. Pillow2. PySide23. PyQtGraphfrom https://blog.csdn.net/zhy29563/article/details/119754910"""import sysimport numpy as npimport pyqtgraph as pgfrom PIL import Imagefrom PyQt5.QtWidgets import QApplication, QVBoxLayout, QPushButton, QWidget, QFileDialogfrom 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 就不是很优雅。

# from https://blog.csdn.net/HG0724/article/details/116702824import sysfrom PyQt5.QtCore import *from PyQt5.QtGui import *from PyQt5.QtWidgets import *from PyQt5.uic import loadUiclass 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 显示多张图片

可以缩放窗口,图像可以随着窗口变化,但只是图像间距拉伸,每行的图片数量没有变化

# -*- coding: utf-8 -*-import globimport timefrom PyQt5 import QtWidgetsfrom PyQt5.QtCore import QSize, Qtfrom PyQt5.QtGui import QPixmapfrom PyQt5.QtWidgets import QApplication, QLabel, QGridLayoutclass 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 < 5 else 5            photo = QPixmap(paths[i])            width = photo.width()            height = photo.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()            w = int(self.width() / self.max_columns * 0.8)            h = int(w * photo.height() / photo.width())            label.setFixedSize(w, h)            label.setStyleSheet("border:1px solid gray")            label.setPixmap(photo)            label.setScaledContents(True)  # 图像自适应窗口大小            self.gridLayout.addWidget(label, row, col)            # 计算下一个label 位置            if col < self.max_columns - 1:                col = col + 1            else:                col = 0                row += 1        print('load images --end')if __name__ == '__main__':    start_time = time.time()    print('main layout show')    app = QApplication([])    main_window = Picture()    main_window.show()    image_list = url = glob.glob(r"C:\waDump\*.jpg")    # 加载图像显示    main_window.load_images(image_list)    print("耗时: {:.3f}秒".format(time.time() - start_time))    app.exec_()

使用 QListWidget + 自定义的 QListWidgetItem 显示多张图片

可以缩放窗口,图像可以随着窗口重新排列,自定义的QListWidgetItem 可以灵活自定义显示样式。
代码参考这两个博客 PyQt使用笔记(六) 可多选, 有右键复制删除功能的ListWidget 2021.03.23[pyqt] 使用自定义QListWidgetItem

# -*- coding: utf-8 -*-import timefrom PyQt5 import QtWidgets, QtCore, QtGuifrom PyQt5.QtCore import QSizefrom PyQt5.QtCore import Qtfrom PyQt5.QtCore import pyqtSignalfrom PyQt5.QtGui import QCursorfrom PyQt5.QtGui import QPixmapfrom PyQt5.QtWidgets import QApplicationfrom PyQt5.QtWidgets import QMenu, QAbstractItemView, QListWidgetItem, QListViewfrom PyQt5.QtWidgets import QWidget, QLabel, QVBoxLayoutclass ImageListWidget(QtWidgets.QListWidget):    signal = pyqtSignal(list)    def __init__(self, *args, **kwargs):        super().__init__(*args, **kwargs)        self.image_cmp_widget = None        self.single_image = None        self.setWindowTitle('All Images')        self.resize(1400, 700)        self.setContextMenuPolicy(Qt.CustomContextMenu)        # 创建QMenu信号事件        self.customContextMenuRequested.connect(self.showMenu)        self.contextMenu = QMenu(self)        self.CMP = self.contextMenu.addAction('比较')        # self.CP = self.contextMenu.addAction('复制')        self.DL = self.contextMenu.addAction('删除')        # self.CP.triggered.connect(self.copy)        self.DL.triggered.connect(self.del_text)        # 设置每个item size        self.setGridSize(QtCore.QSize(220, 190))        # 设置横向list        self.setFlow(QListView.LeftToRight)        # 设置换行        self.setWrapping(True)        # 窗口size 变化后重新计算列数        self.setResizeMode(QtWidgets.QListView.Adjust)        # 设置选择模式        self.setSelectionMode(QAbstractItemView.ExtendedSelection)        self.setIconSize(QSize(200, 150))    # 显示右键菜单    def showMenu(self, pos):        # pos 鼠标位置        # 菜单显示前,将它移动到鼠标点击的位置        self.contextMenu.exec_(QCursor.pos())  # 在鼠标位置显示    # 获取选择行的内容    def selected_text(self):        try:            selected = self.selectedItems()            texts = ''            for item in selected:                if texts:                    texts = texts + '\n' + item.text()                else:                    texts = item.text()        except BaseException as e:            print(e)            return        print('selected_text texts', texts)        return texts    def copy(self):        text = self.selected_text()        if text:            clipboard = QApplication.clipboard()            clipboard.setText(text)    def del_text(self):        try:            index = self.selectedIndexes()            row = []            for i in index:                r = i.row()                row.append(r)            for i in sorted(row, reverse=True):                self.takeItem(i)        except BaseException as e:            print(e)            return        self.signal.emit(row)    def mouseDoubleClickEvent(self, e: QtGui.QMouseEvent) -> None:        super().mouseDoubleClickEvent(e)        print('double click')        selected = self.selectedItems()        img_path = ''        for item in selected:            img_path = item.image_path()        if len(img_path) > 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 继承自QListWidgetItemclass 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 < height:            scale_size = QSize(150, 200)        self.avatorLabel.setPixmap(QPixmap(img_path).scaled(scale_size))        # 图像自适应窗口大小        self.avatorLabel.setScaledContents(True)        # 设置布局用来对nameLabel和avatorLabel进行布局        self.hbox = QVBoxLayout()        self.hbox.addWidget(self.avatorLabel)        self.hbox.addWidget(self.nameLabel)        self.hbox.addStretch(1)        # 设置widget的布局        self.widget.setLayout(self.hbox)        # 设置自定义的QListWidgetItem的sizeHint,不然无法显示        self.setSizeHint(self.widget.sizeHint())    def image_path(self):        return self.img_pathif __name__ == '__main__':    print('main layout show')    now = time.time()    app = QApplication([])    main_window = ImageListWidget()    main_window.show()    image_list = ['icon.jpg', 'icon.jpg', 'icon.jpg']    # 数据扩充    image_list = image_list + image_list + image_list + image_list    main_window.load_images(image_list)    # 绑定点击槽函数 点击显示对应item中的name    main_window.itemClicked.connect(lambda item: print('clicked item label:', item.nameLabel.text()))    print("ImageListWidget 耗时: {:.2f}秒".format(time.time() - now))    app.exec_()

来源地址:https://blog.csdn.net/aaa111/article/details/128490906

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

pyqt 显示图片的若干方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

html图片不显示的解决方法

小编给大家分享一下html图片不显示的解决方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!html图片不显示的解决办法:1、检查html代码是否输入正确;2、检
2023-06-14

nginx php 图片不显示的解决方法

本篇内容主要讲解“nginx php 图片不显示的解决方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“nginx php 图片不显示的解决方法”吧!nginx php图片不显示的解决办法:首先
2023-06-20

win8不显示图片缩略图的解决方法

最近有朋友反映在Windows 8系统中浏览图片时不显示缩略图,这到底是怎么回事呢?其实如果出现这种情况的话,要么就是电脑中毒了,要么就是相关缓存文件出了问题。 浏览文件时显示的缩略图,一般都存储在缓存文件夹中,但有时缓存文件会崩溃,这时就
2022-06-04

JavaScript实现显示和隐藏图片的方法

这篇文章给大家分享的是有关JavaScript实现显示和隐藏图片的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。JavaScript是什么JavaScript是一种直译式的脚本语言,其解释器被称为JavaSc
2023-06-14

Win7系统设置图片显示缩略图的方法

我们在平时使用最新win7系统下载系统的时候,也许会遇到很多的问题,比图说我们在电脑里面存的照片或者是图片,我们在上传或者是想要查看某一张的时候发现文件夹里面的图标都是图标显示,根本就XeKRDnaBZ找不到图在哪里,如果说是想要php浏览
2023-06-13

Android实现TextView显示HTML加图片的方法

本文实例讲述了Android实现TextView显示HTML加图片的方法。分享给大家供大家参考,具体如下: TextView显示网络图片,我用android2.3的系统,可以显示图片出来,并且如果图片比较大,应用会卡的现象,肯定是因为使用主
2022-06-06

css在图片上显示遮罩层的方法

小编给大家分享一下css在图片上显示遮罩层的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!css是什么意思css是一种用来表现HTML或XML等文件样式的计算
2023-06-09

python 读取并显示图片的两种方法

转自:http://www.cnblogs.com/yinxiangnan-charles/p/5928689.html在 python 中除了用 opencv,也可以用 matplotlib 和 PIL 这两个库操作图片。本人偏爱 mat
2023-01-31

html中img不显示图片的解决方法

这篇文章主要介绍了html中img不显示图片的解决方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。html img不显示图片的解决办法:1、在图片onload时,再对图片进
2023-06-15

php验证码图片无法显示的解决方法

小编给大家分享一下php验证码图片无法显示的解决方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!php验证码图片无法显示的解决办法:首先打开相应的PHP文件;然
2023-06-14

DEDE图片集上传图片时出错显示(FILEID)的解决方法

某日,某使用DeDe cms v5.5的网站在后台上传图片时出现如下错误: 作为web生手的我很是迷茫。印象里之前并没有做什么改动,于是百思不得其解。Google、百度、DeDe官网搜索了一大圈,发现有这个问题的人不少,但是没有一个给出解决
2022-06-12

jpg图片已损坏无法显示的解决方法

这篇文章给大家分享的是有关jpg图片已损坏无法显示的解决方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。解决方法:首先打开软件,点击左侧的“图片”选项,选择“图片”-“PNG”;然后点击“添加文件”,把已经损坏
2023-06-15

Android中TextView显示插入的图片实现方法

本文实例讲述了Android中TextView显示插入的图片实现方法。分享给大家供大家参考,具体如下: Android系统默认给TextView插入图片提供了三种方式: 1、ImageSpan 2、Html.ImageGetter 3、Te
2022-06-06

iOS开发中实现显示gif图片的方法

我们知道Gif是由一阵阵画面组成的,而且每一帧画面播放的时常可能会不相等,观察上面两个例子,发现他们都没有对Gif中每一帧的显示时常做处理,这样的结果就是整个Gif中每一帧画面都是以固定的速度向前播放,很显然这并不总会符合需求。 于是自己
2022-05-19

Android 网络图片查看显示的实现方法

我们的应用或多或少都会从网络获取图片数据然后进行显示,下面就将实现一个这样的例子,获取网络中的图片! 首先:我们来看一下效果图界面中有三个控件,一个EditText,一个Button,一个ImageView 1、下面是具体布局文件
2022-06-06

html中图片显示不出来的解决方法

小编给大家分享一下html中图片显示不出来的解决方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!解决方法:1、检查代码是否输入正确,使用2、检查图片调用路径是否设置正确需要把.html文件和所要插入的图片放在一个文件夹,
2023-06-15

java读取图片并显示的方法是什么

在Java中,可以使用`ImageIO`类来读取图片并显示。以下是一个简单的示例代码:import javax.imageio.ImageIO;import java.awt.*;import java.awt.image.Buffe
java读取图片并显示的方法是什么
2023-10-28

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录