从POST解码base64以用于PIL

2024-05-15 20:20:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我在烧瓶中制作了一个简单的API,它接受一个以base64编码的图像,然后使用枕头对其进行解码以进行进一步的处理。

我看了一些例子(123),我想我得到了这个过程的要点,但是我一直得到一个错误,枕头无法读取我给它的字符串。

到目前为止我得到的是:

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>

Tags: 图像imageimportapi编码datastring烧瓶
3条回答

对巫术很抱歉,但没有一个答案对我完全有效。下面是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);

你应该试试这样的方法:

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']字符串不应包含示例JSFiddle中的HTML标记或参数data:image/jpeg;base64

为了便于阅读,我修改了Google中的一个示例的图像字符串。

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))

相关问题 更多 >