将将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))
输出分别为:
即目前的问题转变为将‘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))
此时打印的类型信息分别为:
其中BytesIO实现了在内存中读写bytes。
3.对对BufferedReader图像添加图像添加name属性属性
在第二个步骤中我们获得了_io.BufferedReader格式的图像,此时打印该图像获得如下值:
而打印使用io的open函数读取的图像结果如下:
发现转化完成的图像缺少了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)
作者:小平爱吃肉
评论0
最新资源