溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何在Python中使用imghdr模塊識(shí)別圖片的格式

發(fā)布時(shí)間:2021-03-17 16:19:57 來(lái)源:億速云 閱讀:448 作者:Leah 欄目:開發(fā)技術(shù)

本篇文章為大家展示了如何在Python中使用imghdr模塊識(shí)別圖片的格式,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

imghdr模塊

功能描述:imghdr模塊用于識(shí)別圖片的格式。它通過(guò)檢測(cè)文件的前幾個(gè)字節(jié),從而判斷圖片的格式。

唯一一個(gè)API

imghdr.what(file, h=None)

第一個(gè)參數(shù)file可以是用rb模式打開的file對(duì)象或者表示路徑的字符串和PathLike對(duì)象。h參數(shù)是一段字節(jié)串。函數(shù)返回表示圖片格式的字符串。

>>> import imghdr
>>> imghdr.what('test.jpg')
'jpeg'

具體的返回值和描述如下:

返回值描述檢測(cè)方式
jpeg用JFIF或者Exif格式保存的JPEG圖片第7到第10個(gè)字節(jié)是b'JFIF'或者b'Exif'
png可移植網(wǎng)絡(luò)圖形格式(Portable Network Graphic Format)以字節(jié)串b'\x89PNG\r\n\x1a\n'開頭
gifGIF(Graphics Interchange Format)的87版本和89版本前6個(gè)字節(jié)為b'GIF87a'或者b'GIF89a'
tiffTIFF(Tag Image File Format)的兩種字節(jié)順序前兩個(gè)字節(jié)為b'MM'或者b'II'
rgbSGI ImgLib以字節(jié)串b'\x01\xda'開頭
pbmPortable Bitmap第1個(gè)字節(jié)為b'P',第2個(gè)字節(jié)為b'1'或b'4',第3個(gè)字節(jié)為b'\t'或b'\n'或b'\r'
pgmPortable Graymap Files第1個(gè)字節(jié)為b'P',第2個(gè)字節(jié)為b'2'或b'5',第3個(gè)字節(jié)為b'\t'或b'\n'或b'\r'
ppmPortable Pixmap Files第1個(gè)字節(jié)為b'P',第2個(gè)字節(jié)為b'3'或b'6',第3個(gè)字節(jié)為b'\t'或b'\n'或b'\r'
rastSun Raster以字節(jié)串b'\x59\xA6\x6A\x95'開頭
xbmX Bitmap Files以字節(jié)串b'#define ‘開頭
bmpBitmap,Windows標(biāo)準(zhǔn)圖像文件格式以字節(jié)串b'BM'開頭
webp谷歌的WebP格式,Python3.5加入以字節(jié)串b'RIFF'開頭并且第9到第12個(gè)字節(jié)為b'WEBP'
exrOpenEXR,Python3.5加入以字節(jié)串b'\x76\x2f\x31\x01'開頭

模塊內(nèi)部缺陷

當(dāng)h參數(shù)不為空時(shí),模塊會(huì)忽略掉file參數(shù),直接檢測(cè)h參數(shù),但此時(shí)file參數(shù)又是必須提供的,算是一個(gè)設(shè)計(jì)缺陷吧。博主個(gè)人感覺這個(gè)h參數(shù)根本沒(méi)有存在的意義,沒(méi)必要放在參數(shù)列表里面。

>>> import imghdr
>>> imghdr.what('test.jpg', b'\x89PNG\r\n\x1a\n')
'png'
>>>

自定義檢測(cè)流程

imghdr內(nèi)部使用了test_jpeg、test_png、test_gif等函數(shù)檢測(cè)文件的格式。模塊內(nèi)部維護(hù)了一個(gè)函數(shù)列表imghdr.tests,每次調(diào)用what函數(shù)的時(shí)候,會(huì)按列表里的順序調(diào)用檢測(cè)函數(shù),當(dāng)檢測(cè)函數(shù)返回結(jié)果時(shí)退出循環(huán)。用戶可以通過(guò)修改這個(gè)列表達(dá)到修改檢測(cè)流程的目的。同時(shí),也可以自行添加檢測(cè)函數(shù)到列表里面。

下面這個(gè)例子,博主添加了一個(gè)函數(shù)放在檢測(cè)流程的最后提示文件不是圖片:

>>> 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!

自行添加檢測(cè)函數(shù)需要接收兩個(gè)參數(shù)h和f,h是用來(lái)檢測(cè)的字節(jié)串,f是file對(duì)象。但是在模塊內(nèi)部自帶的檢測(cè)函數(shù)都是沒(méi)用到這個(gè)f參數(shù)的…

命令行啟動(dòng)imghdr模塊

博主讀源碼的時(shí)候發(fā)現(xiàn)了官方文檔里面沒(méi)提到的兩個(gè)函數(shù),提供了直接用命令行啟動(dòng)imghdr模塊的方法。

只需要調(diào)用python -m imghdr [-r] file1 file2...就可以直接檢測(cè)文件的類型。file可以是文件也可以是文件夾。該命令默認(rèn)只檢測(cè)文件夾下一層的文件類型,如果需要遞歸檢測(cè),則加上-r參數(shù)。

每個(gè)文件以”文件名: 文件類型/None”的形式打印一行輸出結(jié)果。

上述內(nèi)容就是如何在Python中使用imghdr模塊識(shí)別圖片的格式,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI