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

昨天写程序遇到一个问题,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 方法,就完成了图片的显示。

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

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

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

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 显示超清高分辨率图片的资料请关注我们其它相关文章!

(0)

相关推荐

  • python GUI库图形界面开发之PyQt5图片显示控件QPixmap详细使用方法与实例

    PyQt5图片显示控件QPixmap介绍 QPixmap类用于绘图设备的图像显示,它可以作为一个QPainterDevice对象,也可以加载到一个控件中,通常是标签或者按钮,用于在标签或按钮上显示图像 QPixmap可以读取的图像文件类型有BMP,GIF,JPG等 QPixmap类中常用的方法 方法 描述 copy() 从QRect对象复制到QPixmap对象 fromImage() 将QImage对象转换为QPixmap对象 grabWidget() 从给定的一个窗口小控件创建一个像素图 gr

  • 使用PyQt5实现图片查看器的示例代码

    一.前言 在学习 PyQt5 的过程中我会不断地做一些小的 Demo,用于让自己能够更好地理解和学习,这次要做的就是一个图片查看器,主要功能包括打开图片.拖动图片.放大和缩小图片. 最终实现的图片查看器你效果如下: 二.主要步骤  1.显示图片 PyQt5 绘图系统能渲染矢量图像.位图图像和轮廓字体文本.一般会使用在修改或者提高现有组件的功能,或者创建自己的组件,使用 PyQt5 的绘图 API 进行操作.在 Qt 中有 QPainter 类用于执行绘制的操作,绘图由 paintEvent()

  • opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器

    定位色块常用到hsv色彩空间下的颜色阈值,笔者曾经用openmv时,其IDE有自带一个阈值编辑器,使用起来非常方便,现在在linux上跑cv算法,需要类似的功能,因此自己写了一个阈值编辑器. 目前暂时只支持HSV色彩空间下的阈值编辑. 代码: mian.py: from threshold_ui import Ui_Widget from PyQt5.QtWidgets import QApplication from PyQt5.QtGui import QImage,QPixmap,QFon

  • PyQt5 对图片进行缩放的实例

    如下所示: def shrinkImage(self): ''' 缩小图片 :return: ''' scale = 0.8 #每次缩小20% img = QImage(self.path) #创建图片实例 mgnWidth = int(originWidth * scale) mgnHeight = int(originHeight * scale) #缩放宽高尺寸 size = QSize(mgnWidth, mgnHeight) pixImg = QPixmap.fromImage(img

  • PyQt5 QTable插入图片并动态更新的实例

    方式一:图片+文字 row = 0 # 行号 col = 1 # 列号 icon = QTableWidgetItem(QIcon("../image/a.png"), "Waiting") # 图片+文字 self.tblName.setItem(row, col, icon) # self → Ui_form # 动态刷新,整个方法必须放在主线程内,自启线程无效果 QApplication.processEvents() 示例: 方式二:只有图片的 label

  • pyqt5 使用cv2 显示图片,摄像头的实例

    如下所示: #! /usr/bin/python3 # coding = utf-8 # from PyQt5 import QtGui,QtCore,Qt import sys from PyQt5.QtCore import Qt,pyqtSignal,QSize,QRect,QMetaObject, QCoreApplication, pyqtSlot,QPropertyAnimation,QThread from PyQt5.QtGui import QIcon, QFont, QPix

  • PyQt5 实现给无边框widget窗口添加背景图片

    我就废话不多说了,大家还是直接看代码吧~ #! /usr/bin/env python # -*- coding:utf-8 -*- import sys from PyQt5.QtWidgets import QApplication, QWidget from PyQt5.QtCore import Qt from PyQt5.QtGui import QPalette, QBrush, QPixmap class NoBorderWindow(QWidget): def __init__(

  • python GUI框架pyqt5 对图片进行流式布局的方法(瀑布流flowlayout)

    流式布局 流式布局,也叫做瀑布流布局,是网页中经常使用的一种页面布局方式,它的原理就是将高度固定,然后图片的宽度自适应,这样加载出来的图片看起来就像瀑布一样整齐的水流淌下来. pyqt流式布局 那么在pyqt5中我们怎么使用流式布局呢?pyqt没有这个控件,需要我们自己去封装,下面是流式布局的封装代码. class FlowLayout(QLayout): def __init__(self, parent=None, margin=0, spacing=-1): super(FlowLayou

  • pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法

    代码: import sys from PyQt5.QtWidgets import (QWidget, QHBoxLayout, QLabel, QApplication) from PyQt5.QtGui import QPixmap class Example (QWidget): def __init__(self): super ().__init__ () self.initUI () def initUI(self): hbox = QHBoxLayout (self) lbl =

  • pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法

    1:listWidget 以滚动窗口显示文件下的所有文件: self.listWidget = QtWidgets.QListWidget(self.gridLayoutWidget) self.listWidget.setMaximumSize(QtCore.QSize(16777215, 400)) self.listWidget.setObjectName("listWidget") 以上代码都是以qtDesigner画出来自动生成的 self.listWidget.setVer

随机推荐