最近使用Django来进行图像的传输,由于要求需要使用Json格式进行请求,所以我们尝试了二进制编码放在json里,发现bytes格式不能打入json,于是转为了base64
将图片转为json
图片转为json有2中方法,一个是二进制后再转,一个是转为矩阵以后再转。
import base64 import cv2 #通过opencv转base64 img_im= cv2.imread("D://32.png") aa=base64.b64encode(cv2.imencode('.jpg',img_im)[1]).decode() print(len(aa)) #17292 #通过bytes再转base64 bb=base64.b64encode(open("D://32.png", 'rb').read()) print(len(bb)) #43848
最后采用了Opencv的方式,主要发现opencv的base64编码比第二种短一半,所以用了第一种。
客户端请求发送数据格式
客户端请求服务器的base64,目前我这里发现2中,通过Postman测试。
第一种 ‘form/data':
#客户端: image1= cv2.imread("D://32.png") aa=base64.b64encode(cv2.imencode('.jpg',image1)[1]).decode() r = requests.post(url, data={"image": image1}) print(r.content.decode("utf-8")) #服务端: def image_base64(request): result = request.POST.get("image") img_byte = base64.b64decode(result) img_np_arr = np.fromstring(img_byte, np.uint8) image = cv2.imdecode(img_np_arr, cv2.IMREAD_COLOR) #image 已经转为矩阵了
第二种 ‘application/json':
#客户端: image1= cv2.imread("D://32.png") aa=base64.b64encode(cv2.imencode('.jpg',image1)[1]).decode() r = requests.post(url, json={"image": image1}) print(r.content.decode("utf-8")) #服务端: def local_ocr_base64(request): # result = request.POST.get("image") data = request.body data_json=simplejson.loads(data) #data是str格式的,需要转为json result=data_json["image"] img_byte = base64.b64decode(result) img_np_arr = np.fromstring(img_byte, np.uint8) image = cv2.imdecode(img_np_arr, cv2.IMREAD_COLOR)
补充知识:Django将多个图片保存成一个URL串返回给前端
说明
Django有ImageField字段,是封装好的,使用很方便,但是一个ImageField字段只能保存一张图片的URL,我现在是想将多张图片保存在一个字段里,然后URL和URL之间用一个自定义的分隔符连接起来,这样不用为了图片再设计一个字表。
自定义上传图片
设置settings.py文件,添加如下语句
MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media/') IMAGE_ROOT = os.path.join(MEDIA_ROOT, 'images/') WEB_HOST_MEDIA_URL = os.path.join('http://127.0.0.1:8000', MEDIA_URL[1:], 'images/')
MEDIA_ROOT代表的是用户上传后的文件一般保存的地方,一般在放在项目目录下,例如BASE_DIR就是取得项目绝对地址。而MEDIA_URL是指URL访问时的URL。例如,
BASE_DIR: /Users/incisor/VSCodeProjects/python/Notes
那么
MEDIA_ROOT:/Users/incisor/VSCodeProjects/python/Notes/media
假设media目录下有一张图片2019.jpg,那么
MEDIA_URL: http://127.0.0.1:8000/media/
然后再通过http://127.0.0.1:8000/media/2019.jpg这个URL是可以直接访问这个图片的。
IMAGE_ROOT是我自定义的一个字段,因为我想以后可能会上传视频,或者其他一些文件,想区分开,所以我在media目录下再建了一个目录images,那么
IMAGE_ROOT: /Users/incisor/VSCodeProjects/python/Notes/media/images
WEB_HOST_MEDIA_URL是拼接URL时使用,因为我接下来要自己拼接多个图的URL,MEDIA_URL[1:]的原因时如果不去掉第一个/,那WEB_HOST_MEDIA_URL会是/media/images/,这显然不是我们想要的,所以需要把第一个/去掉。
views.py文件
前端传过来不定数量的图片,可能0张,最多9张,每个图片都做base64编码再传过来,POST请求里有个参数imgs,是一个数组,保存base64编码。
base64编码如下图所示,这只是一部分:
前面的data:image/png;base64, 除了后缀会不同,其他的是固定的,所以我会先从这里取得后缀png,再做编码转换。
import base64 import os import re from datetime import date, datetime from rest_framework import status from rest_framework.decorators import api_view from rest_framework.response import Response from Notes.settings import IMAGE_ROOT, WEB_HOST_MEDIA_URL @api_view(['POST',]) def images(request): urls = '' dir_name = date.today().__str__().replace('-', '_', 2) # 2019_06_21 dirs = os.path.join(IMAGE_ROOT, dir_name) # 将日期作为目录名 if not os.path.isdir(dirs): os.makedirs(dirs) # 判断目录是否存在,不存在则创建 for img in request.data['imgs']: strs = img.split(',') suffix = re.findall(r'/(\w+"htmlcode">from django.contrib import admin from django.urls import path from django.conf.urls.static import static # 需要添加这句,包含静态资源之类的 from note import views from . import settings urlpatterns = [ path('notes/images/', views.images), path('admin/', admin.site.urls), ] urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) # 这句不设置的话,不能通过URL直接访问到图片4、启动服务,python3 manage.py runserver
5、POST请求,然后返回对应的JSON数据
{ "status": 200, "message": "图片上传成功", "urls": "http://127.0.0.1:8000/media/images/2019_06_21/073249204253.png[/--sp--/]http://127.0.0.1:8000/media/images/2019_06_21/073249854323.png" }这样在数据库方面,就可以直接用一个varchar类型来存储多张图了,前端收到URL串,再按照定好的分隔符[/–sp–/]切开后,就可以显示了。
以上这篇Django 实现将图片转为Base64,然后使用json传输就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]