最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2020年03月27日 09:44:20   作者:loovelj  
這篇文章主要介紹了Django 實現(xiàn)將圖片轉(zhuǎn)為Base64,然后使用json傳輸,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

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

將圖片轉(zhuǎn)為json

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

import base64
import cv2

#通過opencv轉(zhuǎn)base64
img_im= cv2.imread("D://32.png")
aa=base64.b64encode(cv2.imencode('.jpg',img_im)[1]).decode()
print(len(aa)) #17292

#通過bytes再轉(zhuǎn)base64
bb=base64.b64encode(open("D://32.png", 'rb').read())
print(len(bb)) #43848

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

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

客戶端請求服務(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ǔ)充知識:Django將多個圖片保存成一個URL串返回給前端

說明

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

自定義上傳圖片

設(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代表的是用戶上傳后的文件一般保存的地方,一般在放在項目目錄下,例如BASE_DIR就是取得項目絕對地址。而MEDIA_URL是指URL訪問時的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這個URL是可以直接訪問這個圖片的。

IMAGE_ROOT是我自定義的一個字段,因為我想以后可能會上傳視頻,或者其他一些文件,想?yún)^(qū)分開,所以我在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文件

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

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

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

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) # 判斷目錄是否存在,不存在則創(chuàng)建
  for img in request.data['imgs']:
    strs = img.split(',')
    suffix = re.findall(r'/(\w+?);', strs[0])[0] # 取得文件后綴
    # 拼接服務(wù)器上的文件名
    # datetime.now()取得當(dāng)前時間,精確到了微秒,一般來說是唯一的了,因為目錄是日期,所以文件名就去掉日期,最后會是一串?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 admin
from django.urls import path
from django.conf.urls.static import static # 需要添加這句,包含靜態(tài)資源之類的
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) # 這句不設(shè)置的話,不能通過URL直接訪問到圖片

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

5、POST請求,然后返回對應(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ù)庫方面,就可以直接用一個varchar類型來存儲多張圖了,前端收到URL串,再按照定好的分隔符[/–sp–/]切開后,就可以顯示了。

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

相關(guān)文章

  • Python使用文件操作實現(xiàn)一個XX信息管理系統(tǒng)的示例

    Python使用文件操作實現(xiàn)一個XX信息管理系統(tǒng)的示例

    這篇文章主要介紹了Python使用文件操作實現(xiàn)一個XX信息管理系統(tǒng)的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Python?selenium?get_cookies獲取cookie不全的解決方案

    Python?selenium?get_cookies獲取cookie不全的解決方案

    之前使用爬蟲時最讓我頭疼的就是cookie失效的問題了,下面這篇文章主要給大家介紹了關(guān)于Python?selenium?get_cookies獲取cookie不全的解決方案,需要的朋友可以參考下
    2022-10-10
  • python os模塊常用的29種方法使用詳解

    python os模塊常用的29種方法使用詳解

    這篇文章主要介紹了python os模塊常用的29種方法使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • python實現(xiàn)漫天飄落的七彩花朵效果

    python實現(xiàn)漫天飄落的七彩花朵效果

    要實現(xiàn)漫天飄落的七彩花朵效果,你可以使用Python的圖形庫,如Pygame或Pyglet,這些庫可以幫助你創(chuàng)建動畫和圖形效果,本文給大家介紹了如何使用python實現(xiàn)漫天飄落的七彩花朵效果,感興趣的朋友可以參考下
    2024-01-01
  • WxPython界面利用pubsub如何實現(xiàn)多線程控制

    WxPython界面利用pubsub如何實現(xiàn)多線程控制

    這篇文章主要介紹了WxPython界面利用pubsub如何實現(xiàn)多線程控制,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 基于Python實現(xiàn)DIT-FFT算法

    基于Python實現(xiàn)DIT-FFT算法

    FFT(Fast Fourier Transformation)是離散傅氏變換(DFT)的快速算法。即為快速傅氏變換。本文將用Python語言實現(xiàn)DIT-FFT算法,感興趣的可以了解一下
    2022-10-10
  • python3.5 + PyQt5 +Eric6 實現(xiàn)的一個計算器代碼

    python3.5 + PyQt5 +Eric6 實現(xiàn)的一個計算器代碼

    這篇文章主要介紹了python3.5 + PyQt5 +Eric6 實現(xiàn)的一個計算器代碼,在windows7 32位系統(tǒng)可以完美運行 計算器,有興趣的可以了解一下。
    2017-03-03
  • Python 面向?qū)ο?成員的訪問約束

    Python 面向?qū)ο?成員的訪問約束

    在Java,C++,以及PHP中都有對應(yīng)的關(guān)鍵字,public,protected,private,但是在Python中卻沒有這些關(guān)鍵字來聲明類成員的訪問作用域。
    2008-12-12
  • python神經(jīng)網(wǎng)絡(luò)ResNet50模型的復(fù)現(xiàn)詳解

    python神經(jīng)網(wǎng)絡(luò)ResNet50模型的復(fù)現(xiàn)詳解

    這篇文章主要為大家介紹了python神經(jīng)網(wǎng)絡(luò)ResNet50模型的復(fù)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Python實現(xiàn)原神抽卡的方法

    Python實現(xiàn)原神抽卡的方法

    這篇文章主要為大家介紹了Python實現(xiàn)原神抽卡的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12

最新評論

阳东县| 哈尔滨市| 南昌市| 抚松县| 普兰县| 塔河县| 苏尼特左旗| 溧水县| 汨罗市| 潼南县| 蒲城县| 冀州市| 定兴县| 大同市| 临西县| 巴林右旗| 南昌市| 涞源县| 开远市| 临沧市| 岑巩县| 稻城县| 剑阁县| 永福县| 汉川市| 南丰县| 天长市| 左权县| 休宁县| 东莞市| 改则县| 运城市| 寿光市| 吐鲁番市| 饶平县| 察隅县| 新乐市| 连平县| 江安县| 长宁区| 徐汇区|