web-dev-qa-db-ja.com

Python PIL:PNG画像を文字列に書き込む方法

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

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

87
maxp

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

import io

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

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

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

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

178
sth

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

26
ozooner

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()
24
Radian

save()は、パスと同様にファイルのようなオブジェクトを取ることができるため、StringIOのようなメモリ内バッファを使用できます。

buf= StringIO.StringIO()
im.save(buf, format= 'JPEG')
jpeg= buf.getvalue()
13
bobince

モダン(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')
10
mightypile

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

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

辞書をファイルに書き込む場合は、im.tostring()メソッドとImage.fromstring()関数をご覧ください。

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

im.tostring()=>文字列

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

Image.fromstring(モード、サイズ、データ)=> image

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

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

8
S.Lott