Python用imghdr模組識別圖片格式執行個體解析,

來源:互聯網
上載者:User

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模組識別圖片格式執行個體解析的全部內容,希望對大家有所協助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.