最近使用Django来进行图像的传输,由于要求需要使用Json格式进行请求,所以我们尝试了二进制编码放在Json里,发现字节格式不能打入Json,于是转为了base64
<强>将图片转为json 强>
图片转为json有2中方法,一个是二进制后再转,一个是转为矩阵以后再转。
进口base64 进口cv2 #通过opencv转base64 img_im=cv2.imread (“D://32. png”) aa=base64.b64encode (cv2.imencode (jpg, img_im) [1]) .decode () 打印(len (aa)) # 17292 #通过字节再转base64 bb=base64.b64encode (open (“D://32。png”, rb) .read ()) 打印(len (bb)) # 43848 >之前最后采用了Opencv的方式,主要发现Opencv的base64编码比第二种短一半,所以用了第一种。
<强>客户端请求发送数据格式强>
客户端请求服务器的base64,目前我这里发现2中,通过邮差测试。
<强>第一种“形式/数据”:强>
#客户端: image1=cv2.imread (“D://32. png”) aa=base64.b64encode (cv2.imencode (jpg, image1) [1]) .decode () r=请求。帖子(url, data=https://www.yisu.com/zixun/{“图像”:image1}) print (r.content.decode (“utf - 8”)) #服务端: def image_base64(请求): 结果=request.POST.get(“图像”) img_byte=base64.b64decode(结果) img_np_arr=np.fromstring (img_byte np.uint8) 形象=cv2。imdecode (img_np_arr cv2.IMREAD_COLOR) #图片已经转为矩阵了 >之前<强>第二种“application/json”:
强>#客户端: image1=cv2.imread (“D://32. png”) aa=base64.b64encode (cv2.imencode (jpg, image1) [1]) .decode () r=请求。帖子(url, json={“图像”:image1}) print (r.content.decode (“utf - 8”)) #服务端: def local_ocr_base64(请求): #结果=request.POST.get(“图像”) data=https://www.yisu.com/zixun/request.body data_json=simplejson.loads(数据)#数据是str格式的,需要转为json 结果=data_json(“图像”) img_byte=base64.b64decode(结果) img_np_arr=np.fromstring (img_byte np.uint8) 形象=cv2。imdecode (img_np_arr cv2.IMREAD_COLOR) >之前<强> Django将多个图片保存成一个URL串返回给前端强>
<强>说明强>
Django有ImageField字段,是封装好的,使用很方便,但是一个ImageField字段只能保存一张图片的网址,我现在是想将多张图片保存在一个字段里,然后URL和URL之间用一个自定义的分隔符连接起来,这样不用为了图片再设计一个字表。
<>强自定义上传图片强>
设置settings.py文件,添加如下语句
MEDIA_URL='/媒体/' MEDIA_ROOT=os.path。加入(BASE_DIR媒体/) IMAGE_ROOT=os.path。加入(MEDIA_ROOT“图像/? WEB_HOST_MEDIA_URL=os.path.join (http://127.0.0.1:8000, MEDIA_URL[1:],“图像/?MEDIA_ROOT代表的是用户上传后的文件一般保存的地方,一般在放在项目目录下,例如BASE_DIR就是取得项目绝对地址。而MEDIA_URL是指URL访问时的URL。例如,
BASE_DIR:/用户/切/VSCodeProjects/python/笔记
引用>那么
MEDIA_ROOT:/用户/切/VSCodeProjects/python/Notes/媒体
引用>假设媒体目录下有一张图片2019. jpg,那么
MEDIA_URL: http://127.0.0.1:8000/媒体/
引用>然后再通过http://127.0.0.1:8000 2019./媒体/jpg这个网址是可以直接访问这个图片的。
IMAGE_ROOT是我自定义的一个字段,因为我想以后可能会上传视频,或者其他一些文件,想区分开,所以我在媒体目录下再建了一个目录图片,那么
IMAGE_ROOT:/用户/切/VSCodeProjects/python/Notes/媒体/图片
引用>WEB_HOST_MEDIA_URL是拼接URL时使用,因为我接下来要自己拼接多个图的URL, MEDIA_URL[1:]的原因时如果不去掉第一个/,那WEB_HOST_MEDIA_URL会是/媒体/图片/,这显然不是我们想要的,所以需要把第一个/去掉。
views.py文件
前端传过来不定数量的图片,可能0张,最多9张,每个图片都做base64编码再传过来,帖子请求里有个参数一个,是一个数组,保存base64编码。
base64编码如下图所示,这只是一部分:
前面的数据:图像/png; base64,除了后缀会不同,其他的是固定的,所以我会先从这里取得后缀png,再做编码转换。
Django实现将图片转为Base64,然后使用json传输