Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,通常用来在HTTP环境下传递较长的数据。本文介绍opencv 图像、1维或者2维numpy 矩阵转化成base64的方法。这几种方法的思路相同:先把numpy转化成字符串,然后再用base64编码。
OpenCV图像转base64
OpenCV图像的数据类型也是numpy 2维数组,OpenCV提供了cv2.imencode
这两个函数来把图片编码成流数据,放到内存缓存中,函数cv2.imdecode
可以从编码的数据流恢复到numpy数组:
# OpenCV 图像转base64编码
img = cv2.imread('data/laska.png')
img_str = cv2.imencode('.jpg', img)[1].tostring() # 将图片编码成流数据,放到内存缓存中,然后转化成string格式
b64_code = base64.b64encode(img_str) # 编码成base64
# 从base64编码恢复OpenCV图像
str_decode = base64.b64decode(b64_code)
nparr = np.fromstring(str_decode, np.uint8)
# img_restore = cv2.imdecode(nparr, cv2.CV_LOAD_IMAGE_COLOR) for python 2
img_restore = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
numpy 1维或者2维数组转base64
对于普通的1维或者2维numpy数组,还可以用ByteIO
进行编码。
# numpy数组转base64编码
arr = np.arange(12).reshape(3, 4)
bytesio = BytesIO()
np.savetxt(bytesio, arr) # 只支持1维或者2维数组,numpy数组转化成字节流
content = bytesio.getvalue() # 获取string字符串表示
print(content)
b64_code = base64.b64encode(content)
# 从base64编码恢复numpy数组
b64_decode = base64.b64decode(b64_code)
arr = np.loadtxt(BytesIO(b64_decode))
print(arr)
用于HTTP传输的时候通常会用base64.urlsafe_b64encode
来代替base64.b64encode
,base64.urlsafe_b64decode
代替base64.b64decode
。两者的区别在于base64.urlsafe_b64encode
会把+
用-
代替,/
用_
代替,避免URL把+``/
当成特殊字符解析了。