PIL を使用して STDIN から png 画像を読み取る際に問題が発生しています。画像が PIL で書き込まれるとすべてスクランブルされますが、単純なファイル オープン、書き込み、クローズを使用してファイルを書き込むと、ファイルは完全に保存されます。
pngファイルを圧縮せずに標準出力に順番にダンプするプログラムがあり、データを読み取り、ほぼすべてのpngでいくつかのルーチンを実行することになっているpythonスクリプトを使用してそのストリームを読み取ります。データをダンプするプログラムは、PNG ファイルを区切るために特定の文字列を書き込みます。文字列は次のとおりです。"{fim:FILE_NAME.png}"
スクリプトは次のようなものです。
import sys
import re
from PIL import Image
png = None
for linha in sys.stdin:
if re.search('{fim:', linha):
fname = linha.replace('{fim:','')[:-2]
# writes data directly to file, works fine
#f = open("/tmp/%s" % fname , 'w')
#f.write(png)
#f.close()
# create a PIL Image from data and writes to disk, fails fine
im = Image.frombuffer("RGB",(640,480),png, "raw", "RGB", 0, 1)
#im = Image.fromstring("RGB",(640,480),png)
im.save("/tmp/%s" % fname)
png = None
else:
if png is None:
png = linha
else:
png+= linha
imagemagick は間違った画像から識別します:
/tmp/1349194042-24.png PNG 640x480 640x480+0+0 8 ビット DirectClass 361KiB 0.010u 0:00.019
imagemagick は、作業イメージから識別します。
/tmp/1349194586-01.png PNG 640x480 640x480+0+0 8 ビット DirectClass 903KiB 0.010u 0:00.010
何が起こっているのか考えている人はいますか?リトルエンディアン/ビッグエンディアンに関するものですか?Image.frombuffer
、Image.fromstring
、さまざまなモードを試しましたが、何もしませんでした。PIL が期待するバッファーに関する詳細情報があるようです。
ありがとう、