2016/11/27(日) [n年前の日記]
#1 [python] PySide の QImage を使って PIL Image と同様のモード結果を得たい
PIL Image は、Image.mode で画像モードを調べることができる。
例えば…。
コレと似たようなことを、PySide の QImage を使ってやりたいなと。
_image_format_out.py
テスト画像は以下。
_tmp_1bit.png
_tmp_grayscale.png
_tmp_indexed.png
_tmp_rgb.png
_tmp_rgba.png
こんな結果に。

QImage.format() で、 _QImage.Format の値が得られるので、それを使って画像モードを判別。
QImage の場合、グレースケール画像も、インデックスカラー画像も、QImage.Format_Indexed8 が返ってきてしまって悩んだけど。 _QImage.allGray() を使えば、パレット内容がグレースケールか、そうでないかが分かるので、そこからグレースケール or インデックスカラーを判別できた。
例えば…。
>>> from PIL import Image
>>> im = Image.open("hoge.png")
>>> im.mode
とでもすれば、文字列で画像モード? 画像フォーマット? が分かる。- "1" : 1bit画像。白黒のみの画像。
- "L" : グレースケール画像。256色のパレットを持っていて、パレットは0(黒)〜255(白)が割り当てられてる。
- "P" : インデックスカラー画像。256色以下のパレットを持っている。
- "RGB" : RGB画像。アルファチャンネルは持ってない。
- "RGBA" : RGBA画像。アルファチャンネルを持っている。
コレと似たようなことを、PySide の QImage を使ってやりたいなと。
_image_format_out.py
u"""
QImageを使って画像フォーマットを確認する.
L(グレースケール)、P(インデックスカラー)、RGB、RGBAを判断する。
動作確認 : Windows10 x64 + Python 2.7.12 + PySide 1.2.4 + Pillow 3.4.2
"""
import sys
from PySide.QtCore import * # NOQA
from PySide.QtGui import * # NOQA
class MyWidget(QWidget):
u"""メインウインドウ相当."""
def __init__(self, *argv, **keywords):
"""init."""
super(MyWidget, self).__init__(*argv, **keywords)
l = QVBoxLayout()
tb = QTextEdit(self)
l.addWidget(tb)
self.setLayout(l)
lst = [
"./tmp_1bit.png",
"./tmp_grayscale.png",
"./tmp_indexed.png",
"./tmp_rgb.png",
"./tmp_rgba.png"
]
for i, fpath in enumerate(lst):
qim = QImage(fpath)
ret = self.get_image_mode(qim)
tb.append("%s is %s" % (fpath, ret))
def get_image_mode(self, qim):
u"""画像モードを調べて返す.
PIL Image.mode と同様、1,L,P,RGB,RGBAで返す。
"""
ret = ""
fmt = qim.format()
if fmt == QImage.Format_Mono:
ret = "1"
elif fmt == QImage.Format_MonoLSB:
ret = "1"
elif fmt == QImage.Format_Indexed8:
ret = "L" if qim.allGray() else "P"
elif fmt == QImage.Format_RGB32:
ret = "RGB"
elif fmt == QImage.Format_ARGB32:
ret = "RGBA"
else:
ret = "UNKNOWN"
print(f)
del qim
return ret
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWidget()
w.show()
sys.exit(app.exec_())
テスト画像は以下。
_tmp_1bit.png
_tmp_grayscale.png
_tmp_indexed.png
_tmp_rgb.png
_tmp_rgba.png
こんな結果に。

QImage.format() で、 _QImage.Format の値が得られるので、それを使って画像モードを判別。
QImage の場合、グレースケール画像も、インデックスカラー画像も、QImage.Format_Indexed8 が返ってきてしまって悩んだけど。 _QImage.allGray() を使えば、パレット内容がグレースケールか、そうでないかが分かるので、そこからグレースケール or インデックスカラーを判別できた。
[ ツッコむ ]
以上です。