PyQt5 显示超清高分辨率图片的方法
作者:muyuuuu 发布时间:2021-07-11 04:16:09
目录
常规加载
QImageReader 类
昨天写程序遇到一个问题,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())
上述代码中,点击『选择图片路径』按钮就会调用文件对话框,选择图片后就会打开。步骤为:
第一步,QFileDialog 选择文件路径
第二步,将文件路径传入 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.
第三步,将 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
代码解析:
创建 QImageReader 对象,方便对图片进行更多的操作
自适应伸缩,将宽度限定为 800,自适应计算高度应该是多少,而后设置要缩放的大小
将设置好的图像读入为 QImage 类型,而后程序里将其转为 QPixmap 类型
正常方法设置即可,超清图像完美被加载
来源:https://muyuuuu.github.io/2021/04/10/pyqt5-load-huge-image/
猜你喜欢
- 听到一些人说现在做产品设计很没有成就感。没有什么创造力,除了抄袭模仿(称之为竞争分析)、千篇一律(又称规范标准)还有复杂的流程、粗制滥造的表
- 1、pyecharts绘制饼图(显示百分比)# 导入模块from pyecharts import options as optsfrom
- 前两天拉取公司前端代码修改,发现在开发者工具的sources选项里边,居然没有列出来我要调试的js脚本,后来观察了一下,脚本是动态在页面里引
- 安装python分三个步骤:*下载python*安装python*检查是否安装成功1、下载Python(1)python下载地址https:
- 前言近端时间看了一个短视频,觉得视频的背景音乐片段很不错,想把这个背景音乐得到,虽然小编运用Python爬虫肯定能得到这首音乐,但是这个音乐
- PHP Session 变量当运行一个应用程序时,你会打开它,做些更改,然后关闭它。这很像一次会话。计算机清楚你是谁。它知道你何时启动应用程
- 我就废话不多说了,大家还是直接看代码吧~'''Created on 2018-4-16'''
- 标题比较麻烦,都有些叙述不清;昨天下午在调试接口框架的时候,遇到了一个问题是这样的:使用python 写了一个函数,return 了两个返回
- 你搜索这个,你会发现好多都是np.zeros(5,2),嗯都是复制的一个国外的帖子,然而没有翻译人家的话。然后你愤怒的关闭页面。这简直就是文
- 前言需求是将两个list同时进行遍历,然后同步的将每个元素add到一个dict中,虽然有麻烦的方式,比如直接用list的数组下标可以实现,但
- 此处收集的是一些夺人心魄的创意广告牌,巧妙的构思十分值得大家观瞻.......超人归来 superman returnsNespressos
- 有时,为了方便看数据的变化情况,需要画一个动态图来看整体的变化情况。主要就是用Matplotlib库。首先,说明plot函数的说明。plt.
- 当今越来越多的应用程序迁移到web平台上。由于没有平台的限制和安装的要求,SAAS的模式看起来非常有吸引力。Web应用程序的界面设计,其核心
- 功能性的文章直接用几个最简单的实现表达:xlsxwriter库的核心就是其Workbook对象。创建一个指定名字的xlsx文件:import
- 一年一度的元宵节刚刚过去,由于时间关系,在元宵节当天晚上11点多才完成本文灯笼的绘制。这两天又在忙着别的事情,所以现在才跟大家分享。一、效果
- 作为前端开发工程师,平时对于Dom的查找遍历和操作是家常便饭。对于优秀的前端来说,也肯定早已有了自己的一套方法来封装这些重复的操作。但是,现
- 安装pyecharts:pip install pyecharts安装snapshot-selenium:pip install snaps
- 导言在前面的教程里我们学习了DataList提供了一些风格样式的属性.而且我们还学习了如何定义HeadStyle, ItemStyle, A
- 网上有不少生成缩略图的ASP组件。若你的虚拟空间不支持注册新组件,可能会感觉自己的网站失色不少。心晴不才,结合网上资源写了个无组件生成缩略图
- 采用二值判断如果确认是噪声,用该点上面一个灰度进行替换。噪声点处理:对原点周围的八个点进行扫描,比较。当该点像素值与周围8个点的值小于N时,