2016-08-31 8 views
0

bmpをNumPy配列に変換し、配列をどこかに格納してから、後でbmp画像に変換しようとしています時間。PILを使用して画像をパレットで開き、その画像を同じパレットで保存する

bmp = Image.open(fn_bmp) 
data = np.array(bmp.convert('P', palette=Image.WEB)) 

このデータは別のファイルに一時的に保存され、後でそのデータを取得します。

bmp = Image.fromarray(np.array(dataset).convert('P', palette=Image.WEB)) 
bmp.save(fn) 

データセットが対象であることを注意== numpyのアレイとnp.array(データセット)に戻すすべてのインデックスにデータを変換しました。

何らかの理由で、この結果イメージを表示または保存すると、パレットカラーに対応する「14」がグレースケール値として解釈され、保存されます。イメージをカラーパレットのビットマップイメージとして保存するにはどうすればよいですか?保存にオプションを追加しようとしました(たとえば、mode = 'P'、palette = Image.WEB)。ご協力ありがとうございました。

EDIT:PILドキュメントのチュートリアル部分において

、それは変換の制限を指定します。

ライブラリは、サポートされる各モードと "L"および "RGB"モードの間の変換をサポートします。他のモード間で変換するには、中間画像(通常は「RGB」画像)を使用する必要があります。

私がやっていたことを達成するためには、最初の配列でイメージをRGBに変換し、2番目のイメージをPに戻す必要があります。

しかし、RGBからPに変換すると、画像(4色のみ)が歪んでしまいます。これには何らかの理由がありますか?

答えて

0

この場合、Image.fromarray(data)はグレースケール画像を返します。この画像を別の画像モードに変換すると、グレースケールのままです!

は、その代わりに、パレットの形で色情報を提供する必要がありますどのようにPILから直接web_paletteを取得するために

# first part 
bmp = Image.open(fn_bmp) 
bmp_P_web = bmp.convert('P', palette=Image.WEB) 
web_palette = bmp_P_web.getpalette() # <--- 
data = np.array(bmp_P_web) 

# second part 
bmp = Image.fromarray(data) 
bmp.putpalette(web_palette) # <--- 

見当もつかないが、ここでnumpyのとit生成するための方法です:

web_palette = np.zeros(3*256, int) 
web_palette[30:-90] = np.mgrid[0:256:51, 0:256:51, 0:256:51].ravel('F') 
関連する問題