Flask接收和返回圖片

上一篇文章介紹一下基本的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)求,可以直接在瀏覽器返回圖片。

參考資料

Convert PIL Image to byte array?

File Stream - ValueError: embedded null byte

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容