web-dev-qa-db-ja.com

PILで使用するためのPOSTからのbase64のデコード

私はFlaskでbase64でエンコードされた画像を受け入れ、それをデコードしてPillowを使用してさらに処理するためのシンプルなAPIを作成しています。

私はいくつかの例を見てきました( 12 、)、プロセスの要点を得ると思いますが、 Pillowが指定した文字列を読み取れないというエラーが表示されます。

ここに私がこれまでに得たものがあります:

import cStringIO
from PIL import Image
import base64

data = request.form
image_string = cStringIO.StringIO(base64.b64decode(data['img']))
image = Image.open(image_string)

エラーが発生します:

IOError: cannot identify image file <cStringIO.StringIO object at 0x10f84c7a0>
39
Lazaro Gamio

次のようなものを試してください:

from PIL import Image
from io import BytesIO
import base64

data['img'] = '''R0lGODlhDwAPAKECAAAAzMzM/////wAAACwAAAAADwAPAAACIISPeQHsrZ5ModrLl
N48CXF8m2iQ3YmmKqVlRtW4MLwWACH+H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw==''' 

im = Image.open(BytesIO(base64.b64decode(data)))

きみの data['img']文字列には、HTMLタグまたはパラメーターを含めないでくださいdata:image/jpeg;base64サンプルJSFiddleにあります。

読みやすくするために、Googleから取った例のイメージ文字列を変更しました。

69
André Teixeira

imgフィールドに含まれるdata:image/jpeg;base64,のメタデータプレフィックスがあります。通常、このメタデータは、画像データをドキュメントまたはスタイルシートに埋め込むときにCSSまたはHTMLデータURIで使用されます。 MIMEタイプと埋め込みデータのエンコーディングをレンダリングブラウザに提供するためにあります。

Base64デコードの前にプレフィックスを削除できます。これにより、PILがロードできる有効な画像データが得られるはずです(以下を参照)が、通常はそうではないように、メタデータがどのようにサーバーに送信されるかを実際に質問する必要があります。

import re
import cStringIO
from PIL import Image

image_data = re.sub('^data:image/.+;base64,', '', data['img']).decode('base64')
image = Image.open(cStringIO.StringIO(image_data))
25
mhawke

ネクロマンシーで申し訳ありませんが、答えは私には完全に機能しませんでした。 Python 3.6およびFlask 0.13。

サーバ:

from flask import Flask, jsonify, request
from io import BytesIO
from web import app
import base64
import re
import json
from PIL import Image

@app.route('/process_image', methods=['post'])
def process_image():
    image_data = re.sub('^data:image/.+;base64,', '', request.form['data'])
    im = Image.open(BytesIO(base64.b64decode(image_data)))
    return json.dumps({'result': 'success'}), 200, {'ContentType': 'application/json'}

クライアントJS:

// file comes from file input
var reader = new FileReader();
reader.onloadend = function () {
    var fileName = file.name;
    $.post('/process_image', { data: reader.result, name: fileName });
};
reader.readAsDataURL(file);
5
cyberj0g