一日一技:如何識別一張圖片的格式
在有些時候,我們拿到了一張圖片的二進制數(shù)據(jù),但卻不知道這張圖片應(yīng)該是什么格式。例如,某個 HTTP接口返回給你一段 Base64編碼的圖片數(shù)據(jù),如下圖所示:
這段 Base64編碼的數(shù)據(jù),實際上對應(yīng)了下面這種圖片:
那么問題來了,這張圖片的格式是 JPG 還是 PNG?是 BMP 還是只有一幀的 GIF?
還有一些網(wǎng)站,他們的圖片URL 格式類似于:https://www.kingname.info/xx/yy/zz,在 URL 中沒有顯示圖片的格式。那么,當(dāng)你用爬蟲把這個圖片下載下來以后,應(yīng)該怎么保存呢?
雖然在大部分情況下,你確實可以把一張 PNG 格式的圖片保存成 JPG,在電腦上也能雙擊打開看。但如果你要寫一些程序來處理圖片,那么圖片的格式就至關(guān)重要了。例如 GIF 里面有幀信息,而JPG 里面卻沒有,PNG 圖片有通道信息,而 JPG 也沒有。如果你下載了一張JPG 的圖片,卻嘗試用處理 GIF 的方式去提取幀信息,顯然就會導(dǎo)致程序報錯。
為了解決這個問題,你可以使用 Pillow 這個常見的圖片處理庫。它可以很容易識別一張常見格式圖片的格式。
我們可以使用如下的命令來安裝 Pillow:
- python3 -m pip install pillow
安裝完成以后,我們使用PIL導(dǎo)入圖片處理的模塊Image:
- from PIL import Image
- img = Image.open('/Users/kingname/Dropbox/50e452c3504a6.jpg')
- print(img.format)
運行效果如下圖所示:
成功把一張 JPG 格式識別為了 JPEG(JPG、JPEG 是同一個東西)。但顯然,我們大多數(shù)情況下,圖片是以二進制的形式存放到內(nèi)存中的,而不是放在硬盤中。但Image.open()接收的參數(shù)是一個文件地址。我們需要讓 Pillow 從內(nèi)存中讀取圖片數(shù)據(jù),生成圖片對象以后,查看它的.format屬性。
這個時候,就可以使用io模塊,把二進制的數(shù)據(jù)包裝成一個假的二進制文件句柄:
- import io
- import base64
- from PIL import Image
- img_base64 = '圖片對應(yīng)的 base64'
- img_byte = base64.b64decode(img_base64.encode())
- img_io = io.BytesIO(img_byte)
- img = Image.open(img_io)
- print(img.format)
運行效果如下圖所示:
這樣一來,我們就成功識別了一張未知圖片的格式了。
本文轉(zhuǎn)載自微信公眾號「未聞Code」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系未聞Code公眾號。