iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 12
0
影片教學

用Django架構建置專屬的LINEBOT吧系列 第 12

[Day 12]用Django架構建置專屬的LINEBOT吧 - 圖片處理(II)用LINE處理圖片

用LINE BOT處理用戶傳送的圖片

上一篇提到關於圖像處理的顏色與位置基礎概念,
那麼今天就介紹如何接收LINE用戶傳送過來的圖片並加以處理吧!

首先在LINE的官方API當中,有獲取檔案資訊的get_message_content功能,
範例如下:

#views.py

elif event.message.type=='image':
    image_name = ''.join(random.choice(string.ascii_letters + string.digits) for x in range(4))
    image_content = line_bot_api.get_message_content(event.message.id)
    image_name = image_name.upper()+'.jpg'
    path='./static/'+image_name
    with open(path, 'wb') as fd:
        for chunk in image_content.iter_content():
            fd.write(chunk)

透過get_message_content的API,
即可將圖片資訊轉換成實體檔案,
並且存放在指定的路徑資料夾,

實際執行一次看看吧,
如果順利執行則能夠在專案資料夾底下的路徑看到實體圖片檔案,

設定Static資料夾為圖片URL路徑資料夾

在settings.py檔案中,曾經設定static這個資料夾的路徑位置,

#settings.py
STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static')
]

為了讓靜態檔案路徑可以轉為URL被外部瀏覽,
需要在urls.py檔案裡面新增以下設定,

#urls.py
#import static
from django.conf.urls.static import static
from django.conf import settings

#加入這一行
urlpatterns+=static(settings.STATIC_URL, document_root=settings.STATICFILES_DIRS)

更改完畢之後,我們可以試著用以下URL在瀏覽器開啟圖片

https://yourdomain.name/static/file_name

如果能夠正常瀏覽圖片,
當然就也代表我們可以把圖片透過LINE的API發送到用戶端囉,

圖片灰階、二值化處理

在第一個階段中,
我們已經成功的將用戶傳送給我們的圖片檔案轉為實體化檔案,
所以我們一樣可以路徑將圖片透過opencv來進行處理,
在這裡我們建立一個專門處理圖片的檔案image_processing.py

#image_processing.py

import cv2 as cv
import numpy as np

def image_processing_1(image_name,image_path):
    #讀取照片原圖
    img = cv.imread(image_path)
    
    #將原圖轉為灰階圖
    gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
    
    #將灰階圖進行二值化處理
    ret,binary=cv.threshold(gray,127,255,cv.THRESH_BINARY)
    
    #將灰階圖與二值化處理圖存為實體檔案
    gray_path = './static/gray_'+image_name
    binary_path = './static/binary_'+image_name
    cv.imwrite(gray_path,gray)
    cv.imwrite(binary_path,binary)

    return gray_path, binary_path

在處理完圖片之後,我們將圖片存為實體檔案,
接著,為了將處理後的圖片呈現出來,
可以將實體圖片以URL路徑回傳給user,

#views.py
from IT_help.image_process import *

...

elif event.message.type=='image':

    image_content = line_bot_api.get_message_content(event.message.id)
    path='./static/+'tmp.jpg'
    with open(path, 'wb') as fd:
        for chunk in image_content.iter_content():
            fd.write(chunk)
    
    #將原圖存為灰階、二值化圖片
    gray,binary = image_processing_1(image_name,path)
    domain = 'eaedbc149726.ngrok.io'
    gray = 'https://'+domain+gray[1:]
    binary = 'https://'+domain+binary[1:]
    message.append(ImageSendMessage(original_content_url=gray,preview_image_url=gray))
    message.append(ImageSendMessage(original_content_url=binary,preview_image_url=binary))
    line_bot_api.reply_message(event.reply_token,message)

進行測試看看,
隨便傳一張圖片,順利的話LINE BOT將回傳兩張經過處理後的圖片,
範例圖片如下:

https://ithelp.ithome.com.tw/upload/images/20200922/20121176zjtMxGIzbF.jpg

https://ithelp.ithome.com.tw/upload/images/20200922/20121176l5BPaGOGWp.jpg

這樣就完成了透過LINEBOT來回傳基礎的圖片處理結果囉~


上一篇
[Day 11]用Django架構建置專屬的LINEBOT吧 - 圖片處理(I)概論
下一篇
[Day 13]用Django架構建置專屬的LINEBOT吧 - 輪廓(Contour)(I)
系列文
用Django架構建置專屬的LINEBOT吧30

尚未有邦友留言

立即登入留言