兩行 Python 代碼,精準識別一張圖片的格式

在有些時候,咱們拿到了一張圖片的二進制數據,但殊不知道這張圖片應該是什麼格式。例如,某個 HTTP接口返回給你一段 Base64編碼的圖片數據,以下圖所示:python


這段 Base64編碼的數據,實際上對應了下面這種圖片:網站


那麼問題來了,這張圖片的格式是 JPG 仍是 PNG?是 BMP 仍是隻有一幀的 GIF?
還有一些網站,他們的圖片URL 格式相似於:https://www.kingname.info/xx/yy/zz,在 URL 中沒有顯示圖片的格式。那麼,當你用爬蟲把這個圖片下載下來之後,應該怎麼保存呢?編碼

 

雖然在大部分狀況下,你確實能夠把一張 PNG 格式的圖片保存成 JPG,在電腦上也能雙擊打開看。但若是你要寫一些程序來處理圖片,那麼圖片的格式就相當重要了。例如 GIF 裏面有幀信息,而JPG 裏面卻沒有,PNG 圖片有通道信息,而 JPG 也沒有。若是你下載了一張JPG 的圖片,卻嘗試用處理 GIF 的方式去提取幀信息,顯然就會致使程序報錯。spa

爲了解決這個問題,你能夠使用 Pillow 這個常見的圖片處理庫。它能夠很容易識別一張常見格式圖片的格式。code

咱們能夠使用以下的命令來安裝 Pillow:orm

python3 -m pip install pillow

安裝完成之後,咱們使用PIL導入圖片處理的模塊Image:對象

from PIL import Image img = Image.open('/Users/kingname/Dropbox/50e452c3504a6.jpg') print(img.format) 

運行效果以下圖所示:blog

 

 

成功把一張 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) 

運行效果以下圖所示:

 

 

這樣一來,咱們就成功識別了一張未知圖片的格式了。

相關文章
相關標籤/搜索