【避坑总结】使用Python的Bottle框架接收base64格式转图片

这几天在做毕业设计,想实现一个功能:前端将要上传的图片转为base64编码,通过post请求提交给用bottle搭的(见过最轻量级的服务器,真是涨见识了)python服务器,然后再在python中进行人脸识别

想着挺简单的一个功能,以为几个小时就能搞定,结果我还是太年轻了。。。

主要是卡在一个坑里出不来:传到python服务器的图片base64解码问题

首先是Python解码base64遇到Incorrect padding错误,这个问题我在百度找了好多资料,有的说python从url上收到的编码最后面的“=”被去除了,要补回来,即

def decode_base64(data):
    missing_padding = len(data) % 4
    if missing_padding != 0:
        data += b'='* (4 - missing_padding)
    return base64.decodestring(data)

问题没解决,还有人说由于标准的Base64编码后可能出现字符+和/,在URL中就不能直接作为参数,所以又有一种"url safe"的base64编码,其实就是把字符+和/分别变成-和_,即这样解决

img64 = request.forms.get('image')
base64.urlsafe_b64decode(img64)

结果很遗憾,问题还是没有解决,突然想到javascript有encodeURIComponent()这个方法,我在前端先转换,再到python服务器上转回来不就好了,于是有了下面的解决方法

#JavaScript前端
var img64 = encodeURIComponent(img64);

#python服务器
def info():
    img64 = request.forms.get('image')
    img64 = urllib.unquote(img64)
    img64 = base64.b64decode(img64)

结果感人,终于转图片成功了!

但是还是高兴得太早了,我拿到的图片是要进行opencv操作的,结果报错,大概意思是图片格式不对。。。我又到百度上找了一圈,解决方法是还是得转格式,代码如下

img_array = np.frombuffer(img64,np.uint8) # 转换np序列
img64=cv2.imdecode(img_array,cv2.COLOR_BGR2RGB)

接着就可以进行图片操作了

解决问题。撒花!!!

你可能感兴趣的:(避坑总结)