2012-12-19 28 views
7

画像を保存せずにpyBarcodeの出力をPIL画像ファイルに変換しようとしています。pyBarcode出力をPILに変換する画像ファイル

>>> import barcode 
>>> from barcode.writer import ImageWriter 
>>> ean = barcode.get_barcode('ean', '123456789102', writer=ImageWriter()) 
>>> filename = ean.save('ean13') 
>>> filename 
u'ean13.png' 

はあなたが上見ることができるように、私は、出力がPILイメージに加工したいので、画像は実際に私のファイルシステム上に保存されないようにする:まず第一に、pyBarcodeは、のような画像ファイルを生成します。だから私はいくつかの変更でした:

i = StringIO() 
ean = barcode.get_barcode('ean', '123456789102', writer=ImageWriter()) 
ean.write(i) 

は、今私はのStringIOファイルオブジェクトを持っていると私はそれを「読んで」とPIL画像ファイルに変換するPILにしたいです。私はImage.newまたはImage.frombufferを使用したかったが、これらの両方の機能にはサイズを入力する必要がありました...バーコードStringIOデータからサイズを決定できませんか? Image.openは、ドキュメントに次のように記載しています。

文字列(ファイル名を表す)またはファイルオブジェクトを使用できます。後者の場合、ファイルオブジェクトはread、seek、tellメソッドを実装し、バイナリモードで開く必要があります。

StringIOインスタンスもファイルオブジェクトではありませんか?バイナリファイルとしてどのように開くのですか?

Image.open(i, 'rb') 
>>> Image.open(i, 'rb')                           
Traceback (most recent call last):                        
    File "<stdin>", line 1, in <module>                     
    File "/home/mark/.virtualenvs/barcode/local/lib/python2.7/site-packages/PIL/Image.py", line 1947, in open                              
    raise ValueError("bad mode")                     
ValueError: bad mode 

私は答えにかなり近いと確信しています。誰かの指導が必要です。事前にみんなありがとう!

+1

あなたは 'Image.open'(私が意味する、ちょうどデフォルトモードで開きます)から2番目のパラメータを省略しようとしたことがありますか? –

+1

'.seek(0)'を 'StringIO'の先頭に戻しましたか?次に、PauloScardineが提案したように、2番目のパラメータを省略します。 'io.BytesIO'も試してみてください。 –

+0

ありがとうございました! seek(0)と2番目のパラメータを省略すると、トリックが実行されました。 – Mark

答えて

7

StringIOオブジェクトは、ファイルオブジェクトです。

あなたはcStringIO moduleStringIOモジュールのC-最適化されたバージョン)を使用している場合しかし、その後、あなたは空のStringIOインスタンスをceateたら、それは書き込み専用に最適化されていることに注意しないと、あなたが入力のようにそれを使用することはできませんファイル、およびその逆。単にそのような場合には、それを再初期化:

Pythonのバージョン( StringIOモジュール)については
i = StringIO(i.getvalue()) # create a cStringIO.StringO instance for a cStringIO.StringI instance. 

、もう一度スタートをシーク:

i.seek(0) 

をあなたはを行うがためにファイルモードを指定する必要はありませんImage.open()コール; iは、それがどのような場合には無視されます文字列である場合を除き:

img = Image.open(i) 
+0

ありがとう! i.seek(0)がトリックをしました。 StringIO(i.getvalue()) – Mark

+0

@Mark: 'from cStringIO import StringIO'の場合、StringIO( 'somevalue')'は出力(読み取り専用)オブジェクトを作成します'StringIO()'は入力オブジェクトを作成します(書き込み専用)。したがって、書き込みから読み取りに切り替えるには、後者から最初のタイプを作成する必要があります。 –

+0

ああ!わかった。引数を指定すると、出力は読み取り専用になります。引数を省略すると、出力は書き込み専用になります。これはあなたが意味することですか? – Mark

関連する問題