PyQt5のQPixmapで読み込める画像ファイルを確認

QPixmapで読み込める画像ファイルの形式をプログラムを作成して確認してみました。

QPixmapで画像ファイルの読み込み

QPixmapのコンストラクタは以下の通りで、QPixmapのコンストラクタの第一引数にファイル名を渡すと画像ファイルを読み込み、QPixmapに変換することができます。

QPixmap::QPixmap(const QString &fileName, const char *format = nullptr, Qt::ImageConversionFlags flags = Qt::AutoColor)

ファイルが存在しないか、形式が不明な場合はQPixmapはnullとなり、isNull()でnullであるか判定ができます。

様々な画像ファイルを読み込ませてみる

リファレンスには下記のフォーマットに対応していると書かれているようです。

Format Description Qt’s support
BMP Windows Bitmap Read/write
GIF Graphic Interchange Format (optional) Read
JPG Joint Photographic Experts Group Read/write
JPEG Joint Photographic Experts Group Read/write
PNG Portable Network Graphics Read/write
PBM Portable Bitmap Read
PGM Portable Graymap Read
PPM Portable Pixmap Read/write
XBM X11 Bitmap Read/write
XPM X11 Pixmap Read/write

様々な画像ファイルを読み込ませてみる

ペイントとInkscapeで形式を変換して下記のファイルを読み込んでみました。

下記に記載しているソースコードを使用して、GUIで画像を表示するテストをしてみました。QPixmapで読み込みできなかった形式は「The file does not exist or is of an unknown format」と表示して、読み込み可能な形式はその画像を表示するというプログラムです。

サポートしている形式の確認方法

さらにリファレンスを読んでいると、QImageReader.supportedImageFormatsにサポートしている形式の取得方法が書いていました。

from PyQt5 import QtGui

for byteArray in QtGui.QImageReader().supportedImageFormats():
    print( bytes(byteArray).decode() )

上記のコードを実行すると、以下の結果が得られました。

bmp
cur
gif
icns
ico
jpeg
jpg
pbm
pgm
png
ppm
svg
svgz
tga
tif
tiff
wbmp
webp
xbm
xpm

ソースコード

様々な画像ファイルを読み込ませてみるで使用したコードは以下の通りです。

# -*- coding: utf-8 -*-
import sys
from pathlib import Path
from PyQt5 import QtWidgets, QtCore, QtGui

class Widget(QtWidgets.QWidget):
    def __init__(self):
        super(Widget, self).__init__()

        self.model = QtGui.QStandardItemModel()

        self.list = QtWidgets.QListView(self)
        self.list.setModel(self.model)
        self.list.setMaximumWidth(150)
        self.list.clicked.connect(self.listClicked)

        self.scene = QtWidgets.QGraphicsScene()
        self.view = QtWidgets.QGraphicsView(self)
        self.view.setScene(self.scene)

        self.setLayout( QtWidgets.QHBoxLayout() )
        self.layout().addWidget(self.list)
        self.layout().addWidget(self.view)

    def appendRow(self, data, text):
        item = QtGui.QStandardItem(text)
        item.setData(data)
        self.model.appendRow(item)

    def listClicked(self, clickedIndex):
        path = str( self.model.itemFromIndex(clickedIndex).data().absolute() )
        pixmap = QtGui.QPixmap(path)
        self.scene.clear()
        if pixmap.isNull():
            textItem = QtWidgets.QGraphicsTextItem('The file does not exist \nor is of an unknown format')
            self.scene.addItem(textItem)
            self.scene.setSceneRect( textItem.boundingRect() )
        else:
            self.scene.addPixmap(pixmap)
            self.scene.setSceneRect( QtCore.QRectF(pixmap.rect()) )
        self.view.fitInView(self.scene.items()[0], QtCore.Qt.KeepAspectRatio)

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    for path in Path().glob('test1.*'):
        w.appendRow(path, path.name)
    w.show()
    app.exec()

記事の共有

関連記事

コメント

comments powered by Disqus