2017-03-28 19 views
0

この配列への変更が画像に反映されるように、1d numpyの整数配列から画像を作成しようとしています。 Image.frombufferが私のニーズに完全に合っているようです。私の試みがあります:PILのImage.frombufferが間違った画像を作成する

from PIL import Image 
import numpy as np 

data = np.full(100, 255, dtype = np.int32) 
img = Image.frombuffer('RGB', (10, 10), data) 
print(list(img.getdata())) 

私は100個のタプル(0, 0, 255)のリストを表示することが期待しました。しかし、私が実際に得ているのは、(0, 0, 255), (0, 0, 0), (0, 0, 0), (0, 255, 0), (0, 0, 0), (0, 0, 0), (255, 0, 0), (0, 0, 0), (0, 0, 255), (0, 0, 0), (255, 0, 0), ...

その動作の理由は何ですか?

答えて

1

'RGB'は、1ピクセルあたり3バイトを使用します。指定したバッファは、要素ごとに4バイトを使用するデータ型がnumpy.int32の配列です。だからあなたは不一致があります。それは良い解決策は、あなたがイメージをどうしようとしているかに依存しているかどうかは

img = Image.frombuffer('RGBA', (10, 10), data) 

:それを処理するために

一つの方法は、モード'RGBA'を使用することです。

また、RGBAピクセルの(255,0,0,0)または(0,0,0,255)の値は、dataの整数のendianessによって異なります。 RGB画像の場合

は、ここで代替です:

data = np.zeros(300, dtype=np.uint8) 
# Set the blue channel to 255. 
data[2::3] = 255 
img = Image.frombuffer('RGB', (10, 10), data) 

問題のためのより多くの文脈がなければそれはあなたのために有用であるならば、私は知りません。

+0

なぜ、 'int24'型がないのですか? OK、 'RGBA'で動作します。この画像を何らかの方法でユーザーの画面に描画します。 – Dimansel

関連する問題