午夜剧场伦理_日本一道高清_国产又黄又硬_91黄色网战_女同久久另类69精品国产_妹妹的朋友在线

您的位置:首頁技術(shù)文章
文章詳情頁

Django 實(shí)現(xiàn)將圖片轉(zhuǎn)為Base64,然后使用json傳輸

瀏覽:194日期:2024-05-28 16:17:44

最近使用Django來進(jìn)行圖像的傳輸,由于要求需要使用Json格式進(jìn)行請(qǐng)求,所以我們嘗試了二進(jìn)制編碼放在json里,發(fā)現(xiàn)bytes格式不能打入json,于是轉(zhuǎn)為了base64

將圖片轉(zhuǎn)為json

圖片轉(zhuǎn)為json有2中方法,一個(gè)是二進(jìn)制后再轉(zhuǎn),一個(gè)是轉(zhuǎn)為矩陣以后再轉(zhuǎn)。

import base64import cv2#通過opencv轉(zhuǎn)base64img_im= cv2.imread('D://32.png')aa=base64.b64encode(cv2.imencode(’.jpg’,img_im)[1]).decode()print(len(aa)) #17292#通過bytes再轉(zhuǎn)base64bb=base64.b64encode(open('D://32.png', ’rb’).read())print(len(bb)) #43848

最后采用了Opencv的方式,主要發(fā)現(xiàn)opencv的base64編碼比第二種短一半,所以用了第一種。

客戶端請(qǐng)求發(fā)送數(shù)據(jù)格式

客戶端請(qǐng)求服務(wù)器的base64,目前我這里發(fā)現(xiàn)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'))#服務(wù)端: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 已經(jīng)轉(zhuǎn)為矩陣了

第二種 ‘a(chǎn)pplication/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'))#服務(wù)端:def local_ocr_base64(request): # result = request.POST.get('image') data = request.body data_json=simplejson.loads(data) #data是str格式的,需要轉(zhuǎn)為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)

補(bǔ)充知識(shí):Django將多個(gè)圖片保存成一個(gè)URL串返回給前端

說明

Django有ImageField字段,是封裝好的,使用很方便,但是一個(gè)ImageField字段只能保存一張圖片的URL,我現(xiàn)在是想將多張圖片保存在一個(gè)字段里,然后URL和URL之間用一個(gè)自定義的分隔符連接起來,這樣不用為了圖片再設(shè)計(jì)一個(gè)字表。

自定義上傳圖片

設(shè)置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代表的是用戶上傳后的文件一般保存的地方,一般在放在項(xiàng)目目錄下,例如BASE_DIR就是取得項(xiàng)目絕對(duì)地址。而MEDIA_URL是指URL訪問時(shí)的URL。例如,

BASE_DIR: /Users/incisor/VSCodeProjects/python/Notes

那么

MEDIA_ROOT:/Users/incisor/VSCodeProjects/python/Notes/media

假設(shè)media目錄下有一張圖片2019.jpg,那么

MEDIA_URL: http://127.0.0.1:8000/media/

然后再通過http://127.0.0.1:8000/media/2019.jpg這個(gè)URL是可以直接訪問這個(gè)圖片的。

IMAGE_ROOT是我自定義的一個(gè)字段,因?yàn)槲蚁胍院罂赡軙?huì)上傳視頻,或者其他一些文件,想?yún)^(qū)分開,所以我在media目錄下再建了一個(gè)目錄images,那么

IMAGE_ROOT: /Users/incisor/VSCodeProjects/python/Notes/media/images

WEB_HOST_MEDIA_URL是拼接URL時(shí)使用,因?yàn)槲医酉聛硪约浩唇佣鄠€(gè)圖的URL,MEDIA_URL[1:]的原因時(shí)如果不去掉第一個(gè)/,那WEB_HOST_MEDIA_URL會(huì)是/media/images/,這顯然不是我們想要的,所以需要把第一個(gè)/去掉。

views.py文件

前端傳過來不定數(shù)量的圖片,可能0張,最多9張,每個(gè)圖片都做base64編碼再傳過來,POST請(qǐng)求里有個(gè)參數(shù)imgs,是一個(gè)數(shù)組,保存base64編碼。

base64編碼如下圖所示,這只是一部分:

前面的data:image/png;base64, 除了后綴會(huì)不同,其他的是固定的,所以我會(huì)先從這里取得后綴png,再做編碼轉(zhuǎn)換。

import base64import osimport refrom datetime import date, datetimefrom rest_framework import statusfrom rest_framework.decorators import api_viewfrom rest_framework.response import Responsefrom 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) # 判斷目錄是否存在,不存在則創(chuàng)建 for img in request.data[’imgs’]: strs = img.split(’,’) suffix = re.findall(r’/(w+?);’, strs[0])[0] # 取得文件后綴 # 拼接服務(wù)器上的文件名 # datetime.now()取得當(dāng)前時(shí)間,精確到了微秒,一般來說是唯一的了,因?yàn)槟夸浭侨掌冢晕募腿サ羧掌冢詈髸?huì)是一串?dāng)?shù)字 img_name = re.sub(r’:|.’, ’’, datetime.now().__str__().split(’ ’)[1]) + ’.’ + suffix img_path = os.path.join(dirs, img_name) with open(img_path, ’wb’) as out: out.write(base64.b64decode(strs[1])) # base64解碼,再寫入文件 out.flush() urls += os.path.join(WEB_HOST_MEDIA_URL, dir_name, img_name) + ’[/--sp--/]’ # 拼接URL,URL與URL之間用[/--sp--/]隔開 result = {} result[’status’] = status.HTTP_200_OK result[’message’] = ’圖片上傳成功’ result[’urls’] = urls[:len(urls) - len(’[/--sp--/]’)] # 去掉末尾的[/--sp--/] return Response(data=result)

3、urls.py文件

from django.contrib import adminfrom django.urls import pathfrom django.conf.urls.static import static # 需要添加這句,包含靜態(tài)資源之類的from note import viewsfrom . import settingsurlpatterns = [ path(’notes/images/’, views.images), path(’admin/’, admin.site.urls),]urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) # 這句不設(shè)置的話,不能通過URL直接訪問到圖片

4、啟動(dòng)服務(wù),python3 manage.py runserver

5、POST請(qǐng)求,然后返回對(duì)應(yīng)的JSON數(shù)據(jù)

{ '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'}

這樣在數(shù)據(jù)庫方面,就可以直接用一個(gè)varchar類型來存儲(chǔ)多張圖了,前端收到URL串,再按照定好的分隔符[/?sp?/]切開后,就可以顯示了。

以上這篇Django 實(shí)現(xiàn)將圖片轉(zhuǎn)為Base64,然后使用json傳輸就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: JavaScript
主站蜘蛛池模板: 97午夜影院 | 日本一区二区在线 | 大黄网站在线观看 | 日韩在线无 | 欧美资源网| 在线观看一区视频 | 黄色片免费视频 | av在线不卡免费观看 | 午夜影视av | 91久久国产综合久久91 | www.精品 | 一区二区免费在线观看视频 | 国产福利资源在线 | 色小姐综合网 | 黄色网址av| 91破解版在线观看 | 亚洲成a人片在线 | 青青草色视频 | 国产精品第十页 | 欧美一区在线视频 | 国产中文av在线 | 99re视频在线观看 | 亚洲精品麻豆 | 日韩毛片在线免费观看 | 草草在线观看 | 毛片在线免费播放 | 最近日本中文字幕 | 国产视频www | 一级特黄a大片免费 | 精品久久久久一区二区 | 午夜激情免费 | 天堂中文在线视频 | 激情视频在线播放 | 成人综合久久 | 中文字幕一区视频 | 国产日韩欧美综合 | 岛国精品在线观看 | 色综久久 | 欧美日韩91 | 亚洲黄色片 | 国产精品福利一区 |