Laz*_*mio 40 python base64 python-imaging-library flask pillow
我在Flask中创建了一个简单的API,它接受在base64中编码的图像,然后将其解码以便使用Pillow进行进一步处理.
我看了一些例子(1,2,3),我觉得我得到的过程的要点,但我不断收到一个错误的枕头无法读取我给它的字符串.
这是我到目前为止所得到的:
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>
And*_*ira 74
你应该尝试类似的东西:
from PIL import Image
from io import BytesIO
import base64
data['img'] = '''R0lGODlhDwAPAKECAAAAzMzM/////wAAACwAAAAADwAPAAACIISPeQHsrZ5ModrLl
N48CXF8m2iQ3YmmKqVlRtW4MLwWACH+H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw==''' 
im = Image.open(BytesIO(base64.b64decode(data)))
您的数据['img']字符串不应包含示例jsfiddle中的html标记或参数data:image/jpeg; base64.
为了便于阅读,我已经更改了我从谷歌中获取的示例的图像字符串.
mha*_*wke 25
字段data:image/jpeg;base64,中包含元数据前缀img.通常,在将图像数据嵌入到文档或样式表中时,此元数据用于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))
对不起,我无法确定所有答案。这是在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);
| 归档时间: | 
 | 
| 查看次数: | 28820 次 | 
| 最近记录: |