1 代码
@app.route('/predict', methods=['POST'])
def predict():
# 获取传送过来的完整原始图像
file = request.form.get('file')
print('file type', type(file))
data_url = str.split(file, ',')[1]
print('data_url type:', type(data_url))
print('data_url:', data_url)
img_data = base64.urlsafe_b64decode(data_url + '=' * (4 - len(data_url) % 4))
print('type data 1:', type(img_data))
img_data = np.frombuffer(img_data, np.uint8)
print('type data 2:', type(img_data))
img_arr = cv2.imdecode(img_data, cv2.IMREAD_COLOR)
print('type data 3:', type(img_data))
cv2.imwrite("./uploadImages/" + str(time()) + "_img.png", img_arr)
2 代码说明
接受文件数据最重要的是对各种文件数据类型的处理,先贴一下上述代码的运行结果:
处理过程:
1)从结果可以看出,flask后端接受的’file’为字符串形式,即对应的是base64编码的图片文件地址url;
2)需要注意的是使用base64编码的图片URL地址,其内容不是单纯的图片数据,还包括一个代表base64编码信息的文件头,如下图中的红色方框中圈出来的部分所示。所以需要从这个URL中提取图片数据的部分,而丢弃这部分没用的文件头,具体做法就是通过定位“,”来将这个URL划分为文件头和文件数据两部分,这里只需要后面一部分就可以了
3)在得到图片纯数据URL之后,我们需要对其进行base64的解码,解码的结果是bytes类型
4)使用np.frombuffer(data, 数据类型)这种方式将bytes类的数据按照给定的数据类型进行解析,这样得到的数据类型是numpy数组类型,这里的numpy数组的shape是一维的!!!;
5)cv2.imdecode的用法是从指定的内存缓存中读取数据,并将数据转化为图片格式,通常用于从网络数据中恢复图像。
备注:个人觉得这里的(5)不一定需要,但是一时也找不到当时参考的那篇博文了。