最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PyQt5 顯示超清高分辨率圖片的方法

 更新時(shí)間:2021年04月10日 16:27:54   作者:muyuuuu  
這篇文章主要介紹了PyQt5 顯示超清高分辨率圖片的方法,幫助大家更好的理解和阿學(xué)習(xí)使用pyqt5,感興趣的朋友可以了解下

昨天寫程序遇到一個(gè)問題,pyqt5 加載常規(guī)的圖片完全可以顯示??僧?dāng)加載超清的高分辨率圖片時(shí),只能顯示一個(gè)小角落。可我就想把一張 3840x2160 的圖片加載到一個(gè) 800x600 的標(biāo)簽里該怎么辦呢?如何自適應(yīng)放縮尺寸,國(guó)內(nèi)社區(qū)眾所周知大多是抄襲,沒什么解決方案;外網(wǎng)站搜了一下也沒找到現(xiàn)成的解決方案,我知道又到了我開坑的時(shí)候了。

常規(guī)加載

先來看一下,如何借助 QLabel 和 QFileDialog 加載低分辨率的圖片,這時(shí)候時(shí)能正常顯示的。

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())

上述代碼中,點(diǎn)擊『選擇圖片路徑』按鈕就會(huì)調(diào)用文件對(duì)話框,選擇圖片后就會(huì)打開。步驟為:

  1. 第一步,QFileDialog 選擇文件路徑
  2. 第二步,將文件路徑傳入 QPixmap 類,通過重載構(gòu)造一個(gè)對(duì)象,文檔原話: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 對(duì)象傳給標(biāo)簽的 setPixmap 方法,就完成了圖片的顯示。

對(duì)于低分辨率圖片,加載是沒問題的:

但高分辨率的圖片,只能顯示一個(gè)角落,也就是藍(lán)色框那一部分:

如何解決呢?既然國(guó)內(nèi)外都沒有現(xiàn)成的解決方案,只能掏出萬能的官方文檔了。

QImageReader 類

需要注意的是官方文檔的語言是 C++,還好我會(huì)C++。打開文檔,映入眼簾的就四句話:

  • QImageReader reader("large.jpeg"); 讀取圖片
  • reader.size(); 圖片尺寸
  • reader.setClipRect(myRect); 圖片裁剪
  • reader.setScaledSize(mySize); 設(shè)置圖片尺寸,文檔原話: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.

剩下的任務(wù)就很簡(jiǎn)單了,讀圖片,設(shè)置尺寸,顯示。

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:
            # 還需要對(duì)圖片進(jìn)行重新調(diào)整大小
            img = QImageReader(fname)
            scale = 800 / img.size().width()
            height = int(img.size().height() * scale)
            img.setScaledSize(QSize(800, height))
            img = img.read()
            # 打開設(shè)置好的圖片
            pixmap = QPixmap(img)
            self.image_label.setPixmap(pixmap)
            self.result.setText("車牌號(hào)放到這里")


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

考慮到可能會(huì)加載超清圖像,為了方便對(duì)圖片進(jìn)行控制,不要采用 QImage 或 QPixmap,而是使用 QImageReader

代碼解析:

  1. 創(chuàng)建 QImageReader 對(duì)象,方便對(duì)圖片進(jìn)行更多的操作
  2. 自適應(yīng)伸縮,將寬度限定為 800,自適應(yīng)計(jì)算高度應(yīng)該是多少,而后設(shè)置要縮放的大小
  3. 將設(shè)置好的圖像讀入為 QImage 類型,而后程序里將其轉(zhuǎn)為 QPixmap 類型
  4. 正常方法設(shè)置即可,超清圖像完美被加載

以上就是PyQt5 顯示超清高分辨率圖片的方法的詳細(xì)內(nèi)容,更多關(guān)于PyQt5 顯示超清高分辨率圖片的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • django自定義模板標(biāo)簽過程解析

    django自定義模板標(biāo)簽過程解析

    這篇文章主要介紹了django自定義模板標(biāo)簽過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Python聊天室?guī)Ы缑鎸?shí)現(xiàn)的示例代碼(tkinter,Mysql,Treading,socket)

    Python聊天室?guī)Ы缑鎸?shí)現(xiàn)的示例代碼(tkinter,Mysql,Treading,socket)

    這篇文章主要介紹了Python聊天室?guī)Ы缑鎸?shí)現(xiàn)的示例代碼(tkinter,Mysql,Treading,socket),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • python pandas寫入excel文件的方法示例

    python pandas寫入excel文件的方法示例

    這篇文章主要介紹了python pandas寫入excel文件的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • 基于PyTorch中view的用法說明

    基于PyTorch中view的用法說明

    這篇文章主要介紹了基于PyTorch中view的用法說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Pycharm debug調(diào)試教程

    Pycharm debug調(diào)試教程

    Debug即程序調(diào)試,是發(fā)現(xiàn)和解決代碼錯(cuò)誤的過程,通過設(shè)置斷點(diǎn)和逐步執(zhí)行,可以監(jiān)控程序執(zhí)行過程和變量狀態(tài),幫助開發(fā)者定位問題,Debug工具還能評(píng)估表達(dá)式和監(jiān)視變量,極大地方便了程序調(diào)試,本文就來介紹一下
    2024-11-11
  • Python中方法鏈的使用方法

    Python中方法鏈的使用方法

    這篇文章主要為大家詳細(xì)介紹了Python中方法鏈的使用方法,方法鏈(method chaining)是面向?qū)ο蟮木幊陶Z言中的一種常見語法,對(duì)方法鏈感興趣的小伙伴們可以參考一下
    2016-02-02
  • Python制作運(yùn)行進(jìn)度條的實(shí)現(xiàn)效果(代碼運(yùn)行不無聊)

    Python制作運(yùn)行進(jìn)度條的實(shí)現(xiàn)效果(代碼運(yùn)行不無聊)

    這篇文章主要介紹了Python制作運(yùn)行進(jìn)度條的實(shí)現(xiàn)效果(代碼運(yùn)行不無聊),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • Pandas數(shù)據(jù)清洗函數(shù)總結(jié)

    Pandas數(shù)據(jù)清洗函數(shù)總結(jié)

    本文主要介紹了Pandas數(shù)據(jù)清洗函數(shù)總結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • Python函數(shù)式編程指南(三):迭代器詳解

    Python函數(shù)式編程指南(三):迭代器詳解

    這篇文章主要介紹了Python函數(shù)式編程指南(三):迭代器詳解,本文講解了迭代器(Iterator)概述、使用迭代器、生成器表達(dá)式(Generator expression)和列表解析(List Comprehension)等內(nèi)容,需要的朋友可以參考下
    2015-06-06
  • Python模擬登錄微博并爬取表情包

    Python模擬登錄微博并爬取表情包

    前段時(shí)間爬取的知乎表情包用完了嗎?今天再帶大家去微博爬一波表情包吧.文中有非常詳細(xì)的代碼示例,廢話不多說,讓我們愉快地開始吧,需要的朋友可以參考下
    2021-06-06

最新評(píng)論

合山市| 逊克县| 乾安县| 河池市| 宜春市| 五指山市| 达拉特旗| 紫阳县| 若羌县| 甘洛县| 奈曼旗| 安徽省| 共和县| 喜德县| 商丘市| 新乐市| 吉林市| 太原市| 宁河县| 安西县| 屏东县| 鹿泉市| 枝江市| 广东省| 原平市| 保亭| 佛教| 旬阳县| 安庆市| 犍为县| 新干县| 阿拉善右旗| 武夷山市| 庆元县| 广河县| 天全县| 宁津县| 宁安市| 龙胜| 乐安县| 合作市|