9

最初に画像を保存せずに、pyBarcode の出力を PIL 画像ファイルに変換しようとしています。まず、pyBarcode は次のような画像ファイルを生成します。

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

上記のように、出力を PIL イメージに処理したいので、イメージをファイル システムに実際に保存したくありません。だから私はいくつかの変更を行いました:

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

私は答えにかなり近いと確信しています。誰かの指導が必要です。よろしくお願いします!

4

2 に答える 2

7

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

ただし、cStringIOモジュール(モジュールの C 最適化バージョンStringIO) を使用している場合は、空のStringIOインスタンスを作成すると、書き込み専用に最適化され、入力ファイルとして使用することはできず、その逆も同様であることに注意してください。 . その場合は、単純に再初期化します。

i = StringIO(i.getvalue())  # create a cStringIO.StringO instance for a cStringIO.StringI instance.

Python バージョン (StringIOモジュール) の場合は、最初からやり直すだけです。

i.seek(0)

呼び出しにファイル モードを指定する必要はありません。Image.open()が文字列でない限りi、いずれの場合も無視されます。

img = Image.open(i)
于 2012-12-19T13:04:21.850 に答える