之前遇到项目需要将图片使用base64编码后作为json的字段传输,现在整理相关读取、编码、解码、显示图片的代码。
import base64
# 读取文件形式读取图片
def get_base64_from_file(path):
with open(path, 'rb') as file:
return str(base64.b64encode(file.read()), encoding='utf-8')
# 编码图片
import base64
def gen_test_img_base64(self):
return get_base64_from_file('core/image_data/1.png') # 替换为需要的图片路径
import cv2 # pip install opencv-python
# base64字符串解码为二进制流
def get_bytes_from_base64(img_base64):
return base64.b64decode(img_base64.encode())
img = get_bytes_from_base64(img_base64)
img_array = np.frombuffer(img, np.uint8)
img_cv = cv2.imdecode(img_array, cv2.COLOR_RGBA2RGB)
得到GBR三通道的ndarray像素数组
因为opencv-python处理的是BGR图片,需要调整通道顺序,不然编码后的图片会偏色。
# 多维np数组交换列的方式
img_cv = img_cv[:,:,[2,1,0]]
img_cv = Image.fromarray(np.uint8(img_cv))
output_buffer = io.BytesIO()
img_cv.save(output_buffer, format='JPEG
img_base64 = str(base64.b64encode(output_buffer.getvalue()), encoding='utf-8')
import io
import base64
img = Image.open(io.BytesIO(base64.b64decode(img_base64.encode())))
img.show()
img = get_bytes_from_base64(img_b64)
img_array = np.frombuffer(img, np.uint8)
img_cv = cv2.imdecode(img_array, cv2.COLOR_RGBA2BGR)
cv2.namedWindow('input_image', cv2.WINDOW_AUTOSIZE)
cv2.imshow('input_image', img_cv)
cv2.waitKey(0)
cv2.destroyAllWindows()