Python用imghdr模塊識別圖片格式實例解析
imghdr模塊
功能描述:imghdr模塊用于識別圖片的格式。它通過檢測文件的前幾個字節(jié),從而判斷圖片的格式。
唯一一個API
imghdr.what(file, h=None)
第一個參數(shù)file可以是用rb模式打開的file對象或者表示路徑的字符串和PathLike對象。h參數(shù)是一段字節(jié)串。函數(shù)返回表示圖片格式的字符串。
>>> import imghdr >>> imghdr.what('test.jpg') 'jpeg'
具體的返回值和描述如下:
返回值 | 描述 | 檢測方式 |
---|---|---|
jpeg | 用JFIF或者Exif格式保存的JPEG圖片 | 第7到第10個字節(jié)是b'JFIF'或者b'Exif' |
png | 可移植網(wǎng)絡(luò)圖形格式(Portable Network Graphic Format) | 以字節(jié)串b'\x89PNG\r\n\x1a\n'開頭 |
gif | GIF(Graphics Interchange Format)的87版本和89版本 | 前6個字節(jié)為b'GIF87a'或者b'GIF89a' |
tiff | TIFF(Tag Image File Format)的兩種字節(jié)順序 | 前兩個字節(jié)為b'MM'或者b'II' |
rgb | SGI ImgLib | 以字節(jié)串b'\x01\xda'開頭 |
pbm | Portable Bitmap | 第1個字節(jié)為b'P',第2個字節(jié)為b'1'或b'4',第3個字節(jié)為b'\t'或b'\n'或b'\r' |
pgm | Portable Graymap Files | 第1個字節(jié)為b'P',第2個字節(jié)為b'2'或b'5',第3個字節(jié)為b'\t'或b'\n'或b'\r' |
ppm | Portable Pixmap Files | 第1個字節(jié)為b'P',第2個字節(jié)為b'3'或b'6',第3個字節(jié)為b'\t'或b'\n'或b'\r' |
rast | Sun Raster | 以字節(jié)串b'\x59\xA6\x6A\x95'開頭 |
xbm | X Bitmap Files | 以字節(jié)串b'#define ‘開頭 |
bmp | Bitmap,Windows標(biāo)準(zhǔn)圖像文件格式 | 以字節(jié)串b'BM'開頭 |
webp | 谷歌的WebP格式,Python3.5加入 | 以字節(jié)串b'RIFF'開頭并且第9到第12個字節(jié)為b'WEBP' |
exr | OpenEXR,Python3.5加入 | 以字節(jié)串b'\x76\x2f\x31\x01'開頭 |
模塊內(nèi)部缺陷
當(dāng)h參數(shù)不為空時,模塊會忽略掉file參數(shù),直接檢測h參數(shù),但此時file參數(shù)又是必須提供的,算是一個設(shè)計缺陷吧。博主個人感覺這個h參數(shù)根本沒有存在的意義,沒必要放在參數(shù)列表里面。
>>> import imghdr >>> imghdr.what('test.jpg', b'\x89PNG\r\n\x1a\n') 'png' >>>
自定義檢測流程
imghdr內(nèi)部使用了test_jpeg、test_png、test_gif等函數(shù)檢測文件的格式。模塊內(nèi)部維護(hù)了一個函數(shù)列表imghdr.tests,每次調(diào)用what函數(shù)的時候,會按列表里的順序調(diào)用檢測函數(shù),當(dāng)檢測函數(shù)返回結(jié)果時退出循環(huán)。用戶可以通過修改這個列表達(dá)到修改檢測流程的目的。同時,也可以自行添加檢測函數(shù)到列表里面。
下面這個例子,博主添加了一個函數(shù)放在檢測流程的最后提示文件不是圖片:
>>> 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!
自行添加檢測函數(shù)需要接收兩個參數(shù)h和f,h是用來檢測的字節(jié)串,f是file對象。但是在模塊內(nèi)部自帶的檢測函數(shù)都是沒用到這個f參數(shù)的…
命令行啟動imghdr模塊
博主讀源碼的時候發(fā)現(xiàn)了官方文檔里面沒提到的兩個函數(shù),提供了直接用命令行啟動imghdr模塊的方法。
只需要調(diào)用python -m imghdr [-r] file1 file2...就可以直接檢測文件的類型。file可以是文件也可以是文件夾。該命令默認(rèn)只檢測文件夾下一層的文件類型,如果需要遞歸檢測,則加上-r參數(shù)。
每個文件以”文件名: 文件類型/None”的形式打印一行輸出結(jié)果。
總結(jié):可能是因為使用的人少的原因,imghdr這個模塊內(nèi)部有挺多小問題,不過只要老老實實按照官方提供的文檔使用是不會出事的。博主后面試著改一下這個模塊然后pr上去。
以上就是本文關(guān)于Python用imghdr模塊識別圖片格式實例解析的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
相關(guān)文章
python實現(xiàn)在windows下操作word的方法
這篇文章主要介紹了python實現(xiàn)在windows下操作word的方法,涉及Python操作word實現(xiàn)打開、插入、轉(zhuǎn)換、打印等操作的相關(guān)技巧,非常具有實用價值,需要的朋友可以參考下2015-04-04python 獲取list特定元素下標(biāo)的實例講解
下面小編就為大家分享一篇python 獲取list特定元素下標(biāo)的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04python django事務(wù)transaction源碼分析詳解
這篇文章主要介紹了python django事務(wù)transaction源碼分析詳解的相關(guān)資料,需要的朋友可以參考下2017-03-03