上一篇文章介紹一下基本的flask文件結(jié)構(gòu),這篇講一下如何用flask接收和返回圖片。包括在接收之后如何用Image或者cv2打開(kāi)圖片做相應(yīng)處理,已經(jīng)處理后,如何將圖片返回。
接收?qǐng)D片
首先寫一個(gè)接收?qǐng)D片的接口,
@img_tansfrom.route('/img/send_img', methods=['POST'])
def send_img():
f = request.files['file']
img = f.read()
print('img',type(img))
im1 = Image.open(img)
print('im1',type(im1))
im2 = cv2.imread(img)
print('im2',type(im2))
return 'Send Img Test'
對(duì)于接收到的圖片,顯示的類型為
img <class 'bytes'>
接收到圖片的已經(jīng)是2進(jìn)制的文件,這里對(duì)于圖像的讀取沒(méi)有問(wèn)題。
但是下面用兩個(gè)常用圖像庫(kù)打開(kāi)的時(shí)候分別報(bào)錯(cuò):
# Image.open()
ValueError: embedded null byte
# cv2.imread()
SystemError: <built-in function imread> returned NULL without setting an error
對(duì)應(yīng)的解決辦法也很簡(jiǎn)單:
使用cv2讀取圖片
im1 = cv2.imdecode(np.frombuffer(img, np.uint8), cv2.IMREAD_COLOR)
# np.ndarray轉(zhuǎn)IMAGE
# im = Image.fromarray(img_cv2)
使用Image讀取圖片
import io
byte_stream = io.BytesIO(img)
im2 = Image.open(byte_stream)
修改以后,重啟服務(wù),發(fā)送圖片測(cè)試,結(jié)果如下:
img <class 'bytes'>
im1 <class 'PIL.PngImagePlugin.PngImageFile'>
im2 <class 'numpy.ndarray'>
返回圖片
接收到了傳來(lái)的圖片下一步就是處理完圖片過(guò)后傳回去,一種方式比較簡(jiǎn)單,就是把圖像轉(zhuǎn)成二進(jìn)制的形式傳回去,用戶端接收的也是一堆二進(jìn)制數(shù)字,還需要后續(xù)的轉(zhuǎn)換才能看圖片。那如果想直接從瀏覽器看到返回的圖片,需要使用flask的send_file方法。
return send_file(
io.BytesIO(imgByteArr),
mimetype='image/png',
as_attachment=True,
attachment_filename='result.jpg'
)
這里的imgByteArr是使用Image讀取處理后的圖片
def draw_img(img):
'''對(duì)讀取的圖片進(jìn)行處理'''
img_stream = io.BytesIO(img)
img = Image.open(img_stream)
# 圖像處理邏輯
#
#
imgByteArr = io.BytesIO()
img.save(imgByteArr,format='PNG')
imgByteArr = imgByteArr.getvalue()
return imgByteArr
這樣啟動(dòng)服務(wù)后,服務(wù)器接收到請(qǐng)求,可以直接在瀏覽器返回圖片。