python图片base64编码与前后端传输

记录下在前后端传输中图像的编解码(使用python作为后端时传输的方式)

查了很多博客,能用的极少,这里写一个可以随取随用的。


import numpy as np
import cv2
from PIL import Image
import base64
from io import BytesIO

# 从文件读取并转为base64编码
def img2str(img_path:str):
	img = cv2.imread(img_path)
    img_data = cv2.imencode('.jpg', img)[1].tobytes()  
    # 将图片编码成流数据,放到内存缓存中,然后转化成string格式
    base64_data = base64.b64encode(img_data)
    img_base64 = str(base64_data, encoding='utf-8')
    return img_base64

# 从 array 将图像编码(直接编码即可,去掉读取那一步)
def array2str(img_np:np.array):
	img_data = cv2.imencode('.jpg', img)[1].tobytes()  
    # 将图片编码成流数据,放到内存缓存中,然后转化成string格式
    base64_data = base64.b64encode(img_data)
    img_base64 = str(base64_data, encoding='utf-8')
    return img_base64

# 读取编码后的图像字符串并转回图像
def str2img(img_str: str):
	# base64 解码图像字符串
    img_bs64 = base64.b64decode(img_str)
    # 使用 pillow Image读取byte流
    #(这里我试过用np 和 cv2 都不好用,用cv2会丢失维度信息)
    pil_img = Image.open(BytesIO(img_bs64))
    # 转为array 格式
    img_rgb = np.asarray(pil_img)
    # 把bgr 转为 rgb
    img_bgr = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2RGB)
    return img_bgr

对于1-2维的array 可以直接使用np
(适用灰度图)

此处参考:https://blog.csdn.net/wangjian1204/article/details/84445334

(ps 这篇博客的第一部分可能有点问题)

# 1 - 2 维数组可以直接从np编码(适合灰度图)
def arr2d2str(arr):
	# 只支持1维或者2维数组,numpy数组转化成字节流
	assert len(arr.shape)<=2,'only allowed 1d or 2d array'
	bytesio = BytesIO()
	np.savetxt(bytesio, arr) 
	content = bytesio.getvalue()
	b64_code = base64.b64encode(content)
	arr2d_str = str(b64_code,encoding='utf-8')
	return arr2d_str
     
# 从base64编码恢复numpy数组
def str2arr2d(arr2d_str):
	b64_decode = base64.b64decode(arr2d_str)
	arr = np.loadtxt(BytesIO(b64_decode))
	print(arr)
	return arr

你可能感兴趣的:(python后端,python,计算机视觉,opencv)