Python用imghdr模組識別圖片格式執行個體解析,
imghdr模組
功能描述:imghdr模組用於識別圖片的格式。它通過檢測檔案的前幾個位元組,從而判斷圖片的格式。
唯一一個API
imghdr.what(file, h=None)
第一個參數file可以是用rb模式開啟的file對象或者表示路徑的字串和PathLike對象。h參數是一段位元組串。函數返回表示圖片格式的字串。
>>> import imghdr>>> imghdr.what('test.jpg')'jpeg'
具體的傳回值和描述如下:
| 傳回值 |
描述 |
檢測方式 |
| jpeg |
用JFIF或者Exif格式儲存的JPEG圖片 |
第7到第10個位元組是b'JFIF'或者b'Exif' |
| png |
可攜式網路圖形(Portable Network Graphic Format) |
以位元組串b'\x89PNG\r\n\x1a\n'開頭 |
| gif |
GIF(Graphics Interchange Format)的87版本和89版本 |
前6個位元組為b'GIF87a'或者b'GIF89a' |
| tiff |
TIFF(Tag Image File Format)的兩種位元組順序 |
前兩個位元組為b'MM'或者b'II' |
| rgb |
SGI ImgLib |
以位元組串b'\x01\xda'開頭 |
| pbm |
Portable Bitmap |
第1個位元組為b'P',第2個位元組為b'1'或b'4',第3個位元組為b'\t'或b'\n'或b'\r' |
| pgm |
Portable Graymap Files |
第1個位元組為b'P',第2個位元組為b'2'或b'5',第3個位元組為b'\t'或b'\n'或b'\r' |
| ppm |
Portable Pixmap Files |
第1個位元組為b'P',第2個位元組為b'3'或b'6',第3個位元組為b'\t'或b'\n'或b'\r' |
| rast |
Sun Raster |
以位元組串b'\x59\xA6\x6A\x95'開頭 |
| xbm |
X Bitmap Files |
以位元組串b'#define ‘開頭 |
| bmp |
Bitmap,Windows標準影像檔格式 |
以位元組串b'BM'開頭 |
| webp |
Google的WebP格式,Python3.5加入 |
以位元組串b'RIFF'開頭並且第9到第12個位元組為b'WEBP' |
| exr |
OpenEXR,Python3.5加入 |
以位元組串b'\x76\x2f\x31\x01'開頭 |
模組內部缺陷
當h參數不為空白時,模組會忽略掉file參數,直接檢測h參數,但此時file參數又是必須提供的,算是一個設計缺陷吧。博主個人感覺這個h參數根本沒有存在的意義,沒必要放在參數列表裡面。
>>> import imghdr>>> imghdr.what('test.jpg', b'\x89PNG\r\n\x1a\n')'png'>>>
自訂檢測流程
imghdr內部使用了test_jpeg、test_png、test_gif等函數檢測檔案的格式。模組內部維護了一個函數列表imghdr.tests,每次調用what函數的時候,會按列表裡的順序調用檢測函數,當檢測函數返回結果時退出迴圈。使用者可以通過修改這個列表達到修改檢測流程的目的。同時,也可以自行添加檢測函數到列表裡面。
下面這個例子,博主添加了一個函數放在檢測流程的最後提示檔案不是圖片:
>>> import imghdr>>> def final(h, f):... print("This file isn\'t a image!")...>>> imghdr.tests.append(final)>>> imghdr.what("imghdr.md")This file isn't a image!
自行添加檢測函數需要接收兩個參數h和f,h是用來檢測的位元組串,f是file對象。但是在模組內部內建的檢測函數都是沒用到這個f參數的…
命令列啟動imghdr模組
博主讀源碼的時候發現了官方文檔裡面沒提到的兩個函數,提供了直接用命令列啟動imghdr模組的方法。
只需要調用python -m imghdr [-r] file1 file2...就可以直接檢測檔案的類型。file可以是檔案也可以是檔案夾。該命令預設只檢測檔案夾下一層的檔案類型,如果需要遞迴檢測,則加上-r參數。
每個檔案以”檔案名稱: 檔案類型/None”的形式列印一行輸出結果。
總結:可能是因為使用的人少的原因,imghdr這個模組內部有挺多小問題,不過只要老老實實按照官方提供的文檔使用是不會出事的。博主後面試著改一下這個模組然後pr上去。
以上就是本文關於Python用imghdr模組識別圖片格式執行個體解析的全部內容,希望對大家有所協助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支援!