PyQt5 显示超清高分辨率图片的方法


Posted in Python onApril 11, 2021

昨天写程序遇到一个问题,pyqt5 加载常规的图片完全可以显示。可当加载超清的高分辨率图片时,只能显示一个小角落。可我就想把一张 3840x2160 的图片加载到一个 800x600 的标签里该怎么办呢?如何自适应放缩尺寸,国内社区众所周知大多是抄袭,没什么解决方案;外网站搜了一下也没找到现成的解决方案,我知道又到了我开坑的时候了。

常规加载

先来看一下,如何借助 QLabel 和 QFileDialog 加载低分辨率的图片,这时候时能正常显示的。

import sys
from PyQt5.QtWidgets import (QMainWindow, QWidget, QHBoxLayout, QApplication, 
                             QPushButton, QLabel, QFileDialog, QVBoxLayout, 
                             QLineEdit)
from PyQt5.QtGui import QPixmap


class mainwindow(QMainWindow):
    def __init__(self):
        super(mainwindow, self).__init__()

        layout = QVBoxLayout()
        w = QWidget()
        w.setLayout(layout)
        self.setCentralWidget(w)

        self.image_label = QLabel()
        self.image_label.setFixedSize(800, 500)
        layout.addWidget(self.image_label)

        tmp_layout = QHBoxLayout()
        btn = QPushButton("选择图片路径")
        tmp_layout.addWidget(btn)
        btn.clicked.connect(self.load_image)

        self.result = QLineEdit()
        self.result.setPlaceholderText("车牌展示")
        self.result.setReadOnly(True)
        tmp_layout.addWidget(self.result)
        layout.addLayout(tmp_layout)

    def load_image(self):
        fname, _ = QFileDialog.getOpenFileName(self, 'Open File', 
                    'C://', "Image files (*.jpg *.png)")
        if fname is not None:
            pixmap = QPixmap(fname)
            self.image_label.setPixmap(pixmap)

if __name__ == '__main__':
    app = QApplication([])
    m = mainwindow()
    m.show()
    sys.exit(app.exec())

上述代码中,点击『选择图片路径』按钮就会调用文件对话框,选择图片后就会打开。步骤为:

  1. 第一步,QFileDialog 选择文件路径
  2. 第二步,将文件路径传入 QPixmap 类,通过重载构造一个对象,文档原话:Constructs a pixmap from the file with the given fileName. If the file does not exist or is of an unknown format, the pixmap becomes a null pixmap.
  3. 第三步,将 QPixmap 对象传给标签的 setPixmap 方法,就完成了图片的显示。

对于低分辨率图片,加载是没问题的:

PyQt5 显示超清高分辨率图片的方法

但高分辨率的图片,只能显示一个角落,也就是蓝色框那一部分:

PyQt5 显示超清高分辨率图片的方法

如何解决呢?既然国内外都没有现成的解决方案,只能掏出万能的官方文档了。

QImageReader 类

需要注意的是官方文档的语言是 C++,还好我会C++。打开文档,映入眼帘的就四句话:

  • QImageReader reader("large.jpeg"); 读取图片
  • reader.size(); 图片尺寸
  • reader.setClipRect(myRect); 图片裁剪
  • reader.setScaledSize(mySize); 设置图片尺寸,文档原话:Another common function is to show a smaller version of the image. Loading a very large image and then scaling it down to the approriate size can be a very memory consuming operation. By calling the QImageReader::setScaledSize function, you can set the size that you want your resulting image to be.

剩下的任务就很简单了,读图片,设置尺寸,显示。

import sys, time
from PyQt5.QtWidgets import (QMainWindow, QWidget, QHBoxLayout, QApplication, 
                             QPushButton, QLabel, QFileDialog, QVBoxLayout, 
                             QLineEdit)
from PyQt5.QtGui import QPixmap, QFont
from PyQt5.Qt import QSize, QImageReader
import qdarkstyle


class mainwindow(QMainWindow):
    def __init__(self):
        super(mainwindow, self).__init__()

        layout = QVBoxLayout()
        w = QWidget()
        w.setLayout(layout)
        self.setCentralWidget(w)

        self.image_label = QLabel()
        self.image_label.setFixedSize(800, 500)
        layout.addWidget(self.image_label)

        tmp_layout = QHBoxLayout()
        btn = QPushButton("选择图片路径")
        tmp_layout.addWidget(btn)
        btn.clicked.connect(self.load_image)

        self.result = QLineEdit()
        self.result.setPlaceholderText("车牌展示")
        self.result.setReadOnly(True)
        tmp_layout.addWidget(self.result)
        layout.addLayout(tmp_layout)

        self.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())

    def load_image(self):
        fname, _ = QFileDialog.getOpenFileName(self, 'Open File', 
                   'C://', "Image files (*.jpg *.png)")
        if fname is not None:
            # 还需要对图片进行重新调整大小
            img = QImageReader(fname)
            scale = 800 / img.size().width()
            height = int(img.size().height() * scale)
            img.setScaledSize(QSize(800, height))
            img = img.read()
            # 打开设置好的图片
            pixmap = QPixmap(img)
            self.image_label.setPixmap(pixmap)
            self.result.setText("车牌号放到这里")


if __name__ == '__main__':
    app = QApplication([])
    font = QFont()
    font.setFamily("SimHei")
    font.setPointSize(14)
    app.setFont(font)
    m = mainwindow()
    m.show()
    sys.exit(app.exec())

考虑到可能会加载超清图像,为了方便对图片进行控制,不要采用 QImage 或 QPixmap,而是使用 QImageReader

代码解析:

  1. 创建 QImageReader 对象,方便对图片进行更多的操作
  2. 自适应伸缩,将宽度限定为 800,自适应计算高度应该是多少,而后设置要缩放的大小
  3. 将设置好的图像读入为 QImage 类型,而后程序里将其转为 QPixmap 类型
  4. 正常方法设置即可,超清图像完美被加载

PyQt5 显示超清高分辨率图片的方法

以上就是PyQt5 显示超清高分辨率图片的方法的详细内容,更多关于PyQt5 显示超清高分辨率图片的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
pycharm 使用心得(六)进行简单的数据库管理
Jun 06 Python
pycharm 使用心得(八)如何调用另一文件中的函数
Jun 06 Python
Python实现批量修改文件名实例
Jul 08 Python
Pycharm学习教程(1) 定制外观
May 02 Python
python实现教务管理系统
Mar 12 Python
django 通过ajax完成邮箱用户注册、激活账号的方法
Apr 17 Python
python smtplib模块自动收发邮件功能(二)
May 22 Python
python使用Plotly绘图工具绘制散点图、线形图
Apr 02 Python
Python 在OpenCV里实现仿射变换—坐标变换效果
Aug 30 Python
Python 保存加载mat格式文件的示例代码
Aug 04 Python
Python Selenium实现无可视化界面过程解析
Aug 25 Python
python 如何调用远程接口
Sep 11 Python
用Python提取PDF表格的方法
用Python提取PDF表格的方法
python实现自动化群控的步骤
Apr 11 #Python
python 调用js的四种方式
Apr 11 #Python
Python WSGI 规范简介
使用pytorch实现线性回归
pytorch实现线性回归以及多元回归
You might like
PHP 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)
2012/06/07 PHP
php_screw 1.5:php加密: 安装与使用详解
2013/06/20 PHP
探寻PHP脚本不报错的原因
2014/06/12 PHP
Smarty局部缓存的几种方法简介
2014/06/17 PHP
destoon实现调用图文新闻的方法
2014/08/21 PHP
php使用session二维数组实例
2014/11/06 PHP
php封装的单文件(图片)上传类完整实例
2016/10/18 PHP
Thinkphp框架中D方法与M方法的区别
2016/12/23 PHP
PHP API接口必备之输出json格式数据示例代码
2017/06/27 PHP
php脚本守护进程原理与实现方法详解
2017/07/20 PHP
实例讲解PHP表单验证功能
2019/02/15 PHP
PHPUnit + Laravel单元测试常用技能
2019/11/06 PHP
js限制文本框为整数和货币的函数代码
2010/10/13 Javascript
基于jQuery的动态表格插件
2011/03/28 Javascript
js中prototype用法详细介绍
2013/11/14 Javascript
动态显示可输入的字数提示还可以输入的字数
2014/04/01 Javascript
JS基于ocanvas插件实现的简单画板效果代码(附demo源码下载)
2016/04/05 Javascript
js实现div在页面拖动效果
2016/05/04 Javascript
浅谈JS函数定义方式的区别
2016/10/30 Javascript
javascript设计模式之策略模式学习笔记
2017/02/15 Javascript
JS中offset和匀速动画详解
2018/02/06 Javascript
Angular刷新当前页面的实现方法
2018/11/21 Javascript
30分钟快速实现小程序语音识别功能
2018/11/27 Javascript
浅谈Vue.js组件(二)
2019/04/09 Javascript
9种python web 程序的部署方式小结
2014/06/30 Python
使用python编写android截屏脚本双击运行即可
2014/07/21 Python
python 处理telnet返回的More,以及get想要的那个参数方法
2019/02/14 Python
详解如何设置Python环境变量?
2019/05/13 Python
Python使用Pandas库实现MySQL数据库的读写
2019/07/06 Python
Opencv+Python识别PCB板图片的步骤
2021/01/07 Python
css3动画效果抖动解决方法
2018/09/03 HTML / CSS
美国环保妈妈、儿童和婴儿用品购物网站:The Tot
2019/11/24 全球购物
大型活动策划方案
2014/01/12 职场文书
党员应该树立反腐倡廉的坚定意识思想汇报
2014/09/12 职场文书
大一新生检讨书
2014/10/29 职场文书
使用pytorch实现线性回归
2021/04/11 Python