将numpy.ndarray格式图像转化为_io.BufferedReader格式

图像格式转换 numpy.ndarray–>_io.BufferedReader

在项目中遇到问题:现有通过opencv的imread()函数读取的图像,需要将图像的格式转化为io.open()函数读取图像的格式来用于requests.post()发送图像文件。现整理问题解决的思路及相应代码。

问题解决的过程

1.首先查看opencv的imread()与Python IO中的open()函数读取图像后格式的不同:

path = '...'
img1=cv2.imread(path)
img2 = open(path, 'rb')
print(type(img1))
print(type(img2))

输出分别为:
<class ‘numpy.ndarray’>
<class ‘_io.BufferedReader’>

即目前的问题转变为将‘numpy.ndarray’格式的图像转化成‘_io.BufferedReader’格式。

2.尝试转换

通过查找资料、猜测和尝试,得到了一种转换的方法:

img1=cv2.imread(path)
ret, img_encode = cv2.imencode('.jpg', img)
str_encode = img_encode.tostring()	#将array转化为二进制类型
f4 = BytesIO(str_encode)	#转化为_io.BytesIO类型
f5 = BufferedReader(f4)		#转化为_io.BufferedReader类型
print(type(str_encode))
print(type(f4))
print(type(f5))

此时打印的类型信息分别为:
<class ‘bytes’>
<class ‘_io.BytesIO’>
<class ‘_io.BufferedReader’>

其中BytesIO实现了在内存中读写bytes。

3.对BufferedReader图像添加name属性

在第二个步骤中我们获得了_io.BufferedReader格式的图像,此时打印该图像获得如下值:
<_io.BufferedReader >
而打印使用io的open函数读取的图像结果如下:
<_io.BufferedReader name=’/home/test.jpg’>
发现转化完成的图像缺少了name属性,而BufferedReader中的name属性不予许通过img.name =’…‘来进行赋值。此时我们先对_io.BytesIO格式图像的name属性进行赋值(f4.name =’…’)再将其转换为BufferedReader格式图像。

图像格式转换完整代码

import cv2
from io import BufferedReader, BytesIO
path = '....jpg'
img=cv2.imread(path)	#我们使用读取图片的方式表示已经存在在内存的图像
ret, img_encode = cv2.imencode('.jpg', img)
str_encode = img_encode.tostring()		#将array转化为二进制类型
f4 = BytesIO(str_encode)		#转化为_io.BytesIO类型
f4.name = '....jpg'		#名称赋值
f5 = BufferedReader(f4)		#转化为_io.BufferedReader类型
print(f5)

# # 使用requests.post发送图像数据:
# url = 'http://×××××/SaveFile/'
# files = {'picName': f5}
# r = requests.post(url, files=files)
# print(r.text)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章