欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

常規(guī)加載

先來(lái)看一下,如何借助 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("車(chē)牌展示")
        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ì)打開(kāi)。步驟為:

  1. 第一步,QFileDialog 選擇文件路徑
  2. 第二步,將文件路徑傳入 QPixmap 類(lèi),通過(guò)重載構(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ì)于低分辨率圖片,加載是沒(méi)問(wèn)題的:

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

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

QImageReader 類(lèi)

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

  • 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("車(chē)牌展示")
        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()
            # 打開(kāi)設(shè)置好的圖片
            pixmap = QPixmap(img)
            self.image_label.setPixmap(pixmap)
            self.result.setText("車(chē)牌號(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 類(lèi)型,而后程序里將其轉(zhuǎn)為 QPixmap 類(lèi)型
  4. 正常方法設(shè)置即可,超清圖像完美被加載

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

相關(guān)文章

  • python 信息同時(shí)輸出到控制臺(tái)與文件的實(shí)例講解

    python 信息同時(shí)輸出到控制臺(tái)與文件的實(shí)例講解

    今天小編就為大家分享一篇python 信息同時(shí)輸出到控制臺(tái)與文件的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • matplotlib設(shè)置legend圖例代碼示例

    matplotlib設(shè)置legend圖例代碼示例

    這篇文章主要介紹了matplotlib設(shè)置legend圖例代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • Python中的元組介紹

    Python中的元組介紹

    今天小編就為大家分享一篇關(guān)于Python中的元組介紹,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • Python實(shí)現(xiàn)Word和TXT文件格式之間的相互轉(zhuǎn)換

    Python實(shí)現(xiàn)Word和TXT文件格式之間的相互轉(zhuǎn)換

    Word文檔(.doc或.docx)和純文本文件(.txt)是兩種常用的文件格式,本文將詳細(xì)介紹如何使用Python實(shí)現(xiàn)Word和TXT文件格式之間的相互轉(zhuǎn)換,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2024-07-07
  • Windows下安裝python2和python3多版本教程

    Windows下安裝python2和python3多版本教程

    這篇文章主要介紹下Windows(我用的Win10)環(huán)境下的python2.x 和 python3.x 的安裝,以及python2.x 與 python3.x 共存時(shí)的配置問(wèn)題。
    2017-03-03
  • pandas 實(shí)現(xiàn)分組后取第N行

    pandas 實(shí)現(xiàn)分組后取第N行

    這篇文章主要介紹了pandas 實(shí)現(xiàn)分組后取第N行的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • python實(shí)現(xiàn)對(duì)變位詞的判斷方法

    python實(shí)現(xiàn)對(duì)變位詞的判斷方法

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)對(duì)變位詞的判斷方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 分享4個(gè)方便且好用的Python自動(dòng)化腳本

    分享4個(gè)方便且好用的Python自動(dòng)化腳本

    自動(dòng)化測(cè)試是把以人為驅(qū)動(dòng)的測(cè)試行為轉(zhuǎn)化為機(jī)器執(zhí)行的一種過(guò)程,直白的就是為了節(jié)省人力、時(shí)間或硬件資源,提高測(cè)試效率,這篇文章主要給大家分享介紹了3個(gè)方便且好用的Python自動(dòng)化腳本,需要的朋友可以參考下
    2022-02-02
  • python讀取和保存圖片5種方法對(duì)比

    python讀取和保存圖片5種方法對(duì)比

    為大家分享一下python讀取和保存圖片5種方法與比較,python中對(duì)象之間的賦值是按引用傳遞的,如果需要拷貝對(duì)象,需要用到標(biāo)準(zhǔn)庫(kù)中的copy模塊
    2018-09-09
  • Python數(shù)據(jù)結(jié)構(gòu)之圖的存儲(chǔ)結(jié)構(gòu)詳解

    Python數(shù)據(jù)結(jié)構(gòu)之圖的存儲(chǔ)結(jié)構(gòu)詳解

    本篇章主要介紹圖,包括圖的定義、相關(guān)術(shù)語(yǔ)、性質(zhì)及存儲(chǔ)結(jié)構(gòu),并用Python代碼實(shí)現(xiàn),需要的朋友可以參考下
    2021-06-06

最新評(píng)論