通过cv2进行转换
import cv2
import base64
import numpy as np
def img_to_base64(img_array):
# 传入图片为rgb格式numpy矩阵,传出的base64也是通过rgb的编码
img_array = cv2.cvtcolor(img_array, cv2.color_rgb2bgr) #rgb2bgr,用于cv2编码
encode_image = cv2.imencode(".jpg", img_array)[1] #用cv2压缩/编码,转为一维数组
byte_data = encode_image.tobytes() #转换为二进制
base64_str = base64.b64encode(byte_data).decode("ascii") #转换为base64
return base64_str
def base64_to_img(base64_str):
# 传入为rgb格式下的base64,传出为rgb格式的numpy矩阵
byte_data = base64.b64decode(base64_str)#将base64转换为二进制
encode_image = np.asarray(bytearray(byte_data), dtype="uint8")# 二进制转换为一维数组
img_array = cv2.imdecode(encode_image, cv2.imread_color)# 用cv2解码为三通道矩阵
img_array = cv2.cvtcolor(img_array, cv2.color_bgr2rgb)# bgr2rgb
return img_array
方法调用:
img = np.zeros((100,100,3), dtype=np.uint8) img[:,:,2]=255 base64_img = img_to_base64(img) img_from_base64 = base64_to_img(base64_img)
结果显示:



通过pil进行转换
from io import bytesio
from pil import image
import base64
def image_to_base64(image):
# 输入为pil读取的图片,输出为base64格式
byte_data = bytesio()# 创建一个字节流管道
image.save(byte_data, format="jpeg")# 将图片数据存入字节流管道
byte_data = byte_data.getvalue()# 从字节流管道中获取二进制
base64_str = base64.b64encode(byte_data).decode("ascii")# 二进制转base64
return base64_str
def base64_to_image(base64_str):
# 输入为base64格式字符串,输出为pil格式图片
byte_data = base64.b64decode(base64_str) # base64转二进制
image = image.open(bytesio(byte_data)) # 将二进制转为pil格式图片
return image
方法调用:
img = np.zeros((100,100,3),dtype=np.uint8) img[:,:,2]=255 image = image.fromarray(img) base64_str = image_to_base64(image) image_from_base64=base64_to_image(base64_str)
结果显示:



直接读取图片方式
import base64
def path2base64(path):
with open(path,"rb") as f:
byte_data = f.read()
base64_str = base64.b64encode(byte_data).decode("ascii")# 二进制转base64
return base64_str
方法调用:
base64_img = path2base64("1.jpg")
img_from_base64 = base64_to_img(base64_img)
总结
无论使用哪种方式进行图片和base64的互相转换,都需要中间变量——二进制格式。
基本过程都为:base64 <——> 二进制 <——> 图片
其中使用到了我的另一篇文章
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论