將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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章