mieki256's diary



2016/11/27() [n年前の日記]

#1 [python] PySide の QImage を使って PIL Image と同様のモード結果を得たい

PIL Image は、Image.mode で画像モードを調べることができる。

例えば…。
>>> from PIL import Image
>>> im = Image.open("hoge.png")
>>> im.mode
とでもすれば、文字列で画像モード? 画像フォーマット? が分かる。

コレと似たようなことを、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

こんな結果に。

image_format_out_ss01.png

QImage.format() で、 _QImage.Format の値が得られるので、それを使って画像モードを判別。

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

以上です。

過去ログ表示

Prev - 2016/11 - Next
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project