1

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.frombufferImage.fromstring、さまざまなモードを試しましたが、何もしませんでした。PIL が期待するバッファーに関する詳細情報があるようです。

ありがとう、

4

2 に答える 2

4

変数にPNGファイルのバイナリデータが含まれている場合、;pngを使用してそれを読み取ることはできません。frombufferこれは、生のピクセルデータの読み取りに使用されます。代わりに、とを使用io.StringIOしてImage.openください。

import io
from PIL import Image

img = Image.open(io.StringIO(png))
于 2012-10-02T16:35:25.520 に答える
0

png変数は、Image.frombuffer() への最初の呼び出しで初期化されていません。標準入力から何かに初期化する必要があります。

の使用についてはよくわかりませんfor linha in sys.stdin:。これにより、ラインバッファ入力が得られます。sys.stdin.read(N) のように、サイズ N のブロック バッファリングされた入力を使用することをお勧めします。これにより、特定のバイト数が読み取られ、ファイル名の区切り文字を切り取り、Image.frombuffer() の入力バッファーを埋めるなど、データを解析できます。

于 2012-10-02T16:26:39.623 に答える