回答:
BytesIO
クラスを使用して、ファイルのように動作する文字列のラッパーを取得できます。BytesIO
オブジェクトは、ファイルと同じインタフェースを提供しますが、単にメモリの内容を保存します。
import io
with io.BytesIO() as output:
image.save(output, format="GIF")
contents = output.getvalue()
format
パラメータで出力形式を明示的に指定する必要があります。明示的に指定しないと、PILが自動的に検出しようとするとエラーが発生します。
ファイルから画像をロードした場合format
、元のファイル形式を含むパラメーターがあるため、この場合はを使用できますformat=image.format
。
io
モジュールを導入する前の古いPython 2バージョンでは、StringIO
代わりにモジュールを使用していました。
You can use a file object instead of a filename. In this case, you must always specify the format.
最初の引数がファイルオブジェクトの場合、2番目の引数を渡す必要があります。これは形式(例:)'PNG'
です。
from io import StringIO
image.save(output, format=image.format)
Python3の場合、BytesIOを使用する必要があります。
from io import BytesIO
from PIL import Image, ImageDraw
image = Image.new("RGB", (300, 50))
draw = ImageDraw.Draw(image)
draw.text((0, 0), "This text is drawn on image")
byte_io = BytesIO()
image.save(byte_io, 'PNG')
続きを読む:http : //fadeit.dk/blog/post/python3-flask-pil-in-memory-image
sthの解決策は私にとってうまくいきませんでし
た...
Imaging / PIL / Image.pyc line 1423-> raise KeyError(ext)#unknown extension
StringIOの場合には存在しないfilenameの拡張子からフォーマットを検出しようとしました
パラメータでフォーマットを自分で設定することで、フォーマット検出をバイパスできます
import StringIO
output = StringIO.StringIO()
format = 'PNG' # or 'JPEG' or whatever you want
image.save(output, format)
contents = output.getvalue()
output.close()
save()
ファイルのようなオブジェクトとパスを使用できるため、次のようにメモリ内バッファを使用できますStringIO
。
buf = StringIO.StringIO()
im.save(buf, format='JPEG')
jpeg = buf.getvalue()
最新(2017年半ばのPython 3.5およびPillow 4.0以降):
StringIOは、以前のように機能しないようです。BytesIOクラスは、これを処理する適切な方法です。Pillowの保存関数は、最初の引数として文字列を想定しており、驚くことにStringIOをそのように認識していません。以下は、以前のStringIOソリューションに似ていますが、代わりにBytesIOがあります。
from io import BytesIO
from PIL import Image
image = Image.open("a_file.png")
faux_file = BytesIO()
image.save(faux_file, 'png')
「このような画像を辞書に保存したい」という場合、これがメモリ内の構造かどうかはわかりません。
メモリ内の画像を柔らかくするためにこれを行う必要はありません。image
オブジェクトを辞書に保存するだけです。
辞書をファイルに書き込む場合は、im.tostring()
メソッドとImage.fromstring()
関数を確認することをお勧めします
http://effbot.org/imagingbook/image.htm
im.tostring()=>文字列
標準の「生」エンコーダーを使用して、ピクセルデータを含む文字列を返します。
Image.fromstring(mode、size、data)=>画像
標準の「生」デコーダーを使用して、文字列のピクセルデータから画像メモリを作成します。
「フォーマット」(.jpeg、.pngなど)は、ファイルを交換する場合にのみディスク上で重要です。ファイルを交換しない場合は、フォーマットは重要ではありません。