115

PILを使用して画像を生成しました。どうすればメモリ内の文字列に保存できますか?このImage.save()メソッドにはファイルが必要です。

そのような画像をいくつか辞書に保存してもらいたいのですが。

4

6 に答える 6

220

このクラスを使用してBytesIO、ファイルのように動作する文字列のラッパーを取得できます。オブジェクトはBytesIOファイルと同じインターフェイスを提供しますが、内容をメモリに保存します。

import io

with io.BytesIO() as output:
    image.save(output, format="GIF")
    contents = output.getvalue()

パラメータを使用して出力形式を明示的に指定する必要がありformatます。そうしないと、PILが自動的に検出しようとしたときにエラーが発生します。

ファイルから画像をロードした場合format、元のファイル形式を含むパラメータが含まれているため、この場合はを使用できますformat=image.format

モジュールを導入する前の古いPython2バージョンでは、代わりにモジュールioを使用していました。StringIO

于 2009-03-14T17:21:04.113 に答える
31

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

于 2015-04-30T15:16:32.053 に答える
25

sthのソリューションは私にはうまくいきませんでし
た...

Imaging / PIL/Image.pyc行1423->raiseKeyError(ext)#不明な拡張子

StringIOの場合には存在しないファイル名の拡張子からフォーマットを検出しようとしていました

パラメータで自分でフォーマットを設定することにより、フォーマット検出をバイパスできます

import StringIO
output = StringIO.StringIO()
format = 'PNG' # or 'JPEG' or whatever you want
image.save(output, format)
contents = output.getvalue()
output.close()
于 2011-03-31T17:46:26.717 に答える
15

save()パスだけでなくファイルのようなオブジェクトも取得できるため、StringIO:のようなメモリ内バッファを使用できます。

buf = StringIO.StringIO()
im.save(buf, format='JPEG')
jpeg = buf.getvalue()
于 2009-03-14T17:39:25.690 に答える
9

「そのような画像を辞書にたくさん保存したい」と言うと、これがメモリ内の構造であるかどうかはわかりません。

メモリ内の画像を整理するために、これを行う必要はありません。imageオブジェクトを辞書に保存するだけです。

辞書をファイルに書き込む場合は、 im.tostring()メソッドとImage.fromstring()関数を確認することをお勧めします

http://effbot.org/imagingbook/image.htm

im.tostring()=>文字列

標準の「raw」エンコーダーを使用して、ピクセルデータを含む文字列を返します。

Image.fromstring(mode、size、data)=> image

標準の「raw」デコーダーを使用して、文字列内のピクセルデータから画像メモリを作成します。

「フォーマット」(.jpeg、.pngなど)は、ファイルを交換するときにディスク上でのみ重要です。ファイルを交換しない場合は、形式は関係ありません。

于 2009-03-14T17:36:43.403 に答える