在有些時候,我們拿到了一張圖片的二進制資料,但卻不知道這張圖片應該是什么格式,例如,某個 HTTP介面回傳給你一段 Base64編碼的圖片資料,如下圖所示:
這段 Base64編碼的資料,實際上對應了下面這種圖片:
那么問題來了,這張圖片的格式是 JPG 還是 PNG?是 BMP 還是只有一幀的 GIF?
還有一些網站,他們的圖片URL 格式類似于:https://www.kingname.info/xx/yy/zz,在 URL 中沒有顯示圖片的格式,那么,當你用爬蟲把這個圖片下載下來以后,應該怎么保存呢?
雖然在大部分情況下,你確實可以把一張 PNG 格式的圖片保存成 JPG,在電腦上也能雙擊打開看,但如果你要寫一些程式來處理圖片,那么圖片的格式就至關重要了,例如 GIF 里面有幀資訊,而JPG 里面卻沒有,PNG 圖片有通道資訊,而 JPG 也沒有,如果你下載了一張JPG 的圖片,卻嘗試用處理 GIF 的方式去提取幀資訊,顯然就會導致程式報錯,
為了解決這個問題,你可以使用 Pillow 這個常見的圖片處理庫,它可以很容易識別一張常見格式圖片的格式,
我們可以使用如下的命令來安裝 Pillow:
python3 -m pip install pillow
安裝完成以后,我們使用PIL匯入圖片處理的模塊Image:
from PIL import Image
img = Image.open('/Users/kingname/Dropbox/50e452c3504a6.jpg')
print(img.format)
運行效果如下圖所示:
成功把一張 JPG 格式識別為了 JPEG(JPG、JPEG 是同一個東西),但顯然,我們大多數情況下,圖片是以二進制的形式存放到記憶體中的,而不是放在硬碟中,但Image.open()接收的引數是一個檔案地址,我們需要讓 Pillow 從記憶體中讀取圖片資料,生成圖片物件以后,查看它的.format屬性,
這個時候,就可以使用io模塊,把二進制的資料包裝成一個假的二進制檔案句柄:
import io
import base64
from PIL import Image
img_base64 = '圖片對應的 base64'
img_byte = base64.b64decode(img_base64.encode())
img_io = io.BytesIO(img_byte)
img = Image.open(img_io)
print(img.format)
運行效果如下圖所示:
這樣一來,我們就成功識別了一張未知圖片的格式了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/263655.html
標籤:Python
