2013-08-28 27 views
9

bytearrayをImage.openImage.verify()で確認するには、まずディスクに書き込んでからim = Image.open()で開きます。私は.readfrombuffer().readfromstring()メソッドを見ましたが、イメージのサイズが必要です(私はバイトストリームをイメージに変換するときにしか得られません)。誰かが私が間違っているのかを知っている場合はPIL:BytearrayをImageに変換する

bytes = readimage(path+extension) 
im = Image.open(StringIO(bytes)) 
im.save(savepath) 

か:私は画像のByteArrayに変換しようとする基本的なテストとして次に

def readimage(path): 
bytes = bytearray() 
count = os.stat(path).st_size/2 
with open(path, "rb") as f: 
    print "file opened" 
    bytes = array('h') 
    bytes.fromfile(f, count) 
return bytes 

マイ読み取り機能は、次のようになりますそれらのバイトを実際に私を助けるイメージに変換するよりエレガントな方法があれば。

P .:私がバイト上の操作(画像に不具合があるため)を行うので、私はバイトアレーが必要だと思った。これはうまくいきましたが、ディスクに書き込むことなく、ディスクから画像ファイルを再度開いて、ファイルが壊れていないかどうかをチェックすることなく、やりたいと思っていました。

編集:それは私を与えるすべては、あなたがbytearraysで操作する場合は、あなたがio.BytesIOを使用する必要がIOError: cannot identify image file

+0

なぜnumpy配列に画像を読み込まないのですか? –

+1

@ViktorKerkez画像のバイトを操作したいからです。私は操作部分の作業コードを持っていますが、出力画像が実際に完全に壊れていないことを確認したいと思います。だから、私はbytearraysで働く必要があります – ato

答えて

10

です。また、bytearrayに直接ファイルを読むことができます。

import os 
import io 
import Image 
from array import array 

def readimage(path): 
    count = os.stat(path).st_size/2 
    with open(path, "rb") as f: 
     return bytearray(f.read()) 

bytes = readimage(path+extension) 
image = Image.open(io.BytesIO(bytes)) 
image.save(savepath) 
+0

なぜあなたはst_sizeの半分ですか?そしてなぜ「カウント」を宣言するのですか? – jdborg

+1

@jdborg OPは彼の質問で同じことをしたので。 :)私はちょうどコピー/コードを貼り付け、エラーを修正しました。 –

+0

また、 'bytes'がPythonの予約語であることを指摘しておく価値があります –

関連する問題