Django实现将图片转为Base64,然后使用json传输

  

最近使用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传输