PyQt5のQPixmapで読み込める画像ファイルを確認
2021/04/02 categories:PyQt5| tags:PyQt5|Python|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で形式を変換して下記のファイルを読み込んでみました。
- test1.bmp
- test1.emf
- test1.eps
- test1.fx
- test1.gif
- test1.jpg
- test1.odg
- test1.pdf
- test1.png
- test1.pov
- test1.ps
- test1.svg
- test1.tex
- test1.tif
- test1.wmf
下記に記載しているソースコードを使用して、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()