ビットの深さに応じて処理を振り分けたい
PIL
とnumpy
を使用してイメージの配列を取得しています。
その情報を、QImage
のコンストラクタに渡して、Image
オブジェクトをこさえています。
その時、QImage
のコンストラクタの第五引数に対して、フォーマットの情報を渡します。
例えば、24bit
の画像に対しては、QtGui.QImage.Format_RGB888
を渡します。
変換の目安としては、PILの場合、"L"が8bitを、”RGB"が24bit
を、"RGBA"が32bit
を表わし、mode
を取得して、"L"か"RGB"か、"RGBA"かで適用するフォーマットを分けていました。
#filenameはimageの名前あるいはディレクトリ
im = Image.open(filename)
print(im.mode)
data = np.array(im)
if im.mode == "RGB":
qimagein = QtGui.QImage(data.data, data.shape[1], data.shape[0], data.strides[0], QtGui.QImage.Format_RGB888)
elif im.mode == "RGBA":
qimagein = QtGui.QImage(data.data, data.shape[1], data.shape[0], data.strides[0], QtGui.QImage.Format_RGB32)
elif im.mode == "1":
qimagein = QtGui.QImage(data.data, data.shape[1], data.shape[0], data.strides[0], QtGui.QImage.Format_Mono)
elif im.mode == "L":
qimagein = QtGui.QImage(data.data, data.shape[1], data.shape[0], data.strides[0], QtGui.QImage.Format_Indexed8)
elif im.mode == "P":
qimagein = QtGui.QImage(data.data, data.shape[1], data.shape[0], data.strides[0], QtGui.QImage.Format_Indexed8)
この時、PというModeが帰って来たものですから、Pillowのチートシートで確認したところ、
8bit
だけれども、パレットモードだということです。
これがオリジナルの8bitのイメージなのですけれども、
上記の処理に載せた後に、イメージを描画すると、
こんな感じでモノクロになります。
8
ビットを描画するために指定するフォーマットとしては、
Format_Indexed8
くらいしかなさそうなんですけれども、
あきらめるしかないでしょうか?
PySide QImage
Pillowの公式サイトで、PillowはQt系のImageコンストラクタの処理と連携しており、
"1","L","P","RGB","RGBA"の5つのモードには対応している。
これ以外のモードを扱うには、convert
を行えと書いてあるのですが、
"P"も対応しているようです。しかし、肝心の、どのフォーマットに当てはめればいいのかが
わかりません。
"RGB"の場合は問題ないのですが、"RGBA"の場合だと、若干色が変化することもあります。
例えば、
が、RGBAとして割り振られたコードを追加した後だと、
こんな風に、一部の色が完全に違うものになってしまいます。
これはどうしてなのかも知りたいです。
Pillow ImageQt Module
1.8bitのパレットモードの画像を、オリジナルと同様に表示する方法
2.RGBAの場合に色が変化する原因と、対処法