Python檢查圖片是否損壞及圖片類型是否正確過(guò)程詳解
檢查圖片是否損壞
日常工作中,時(shí)常會(huì)需要用到圖片,有時(shí)候圖片在下載、解壓過(guò)程中會(huì)損壞,而如果一張一張點(diǎn)擊來(lái)檢查就太不Cool了,因此我想大家都需要一個(gè)檢查腳本;
測(cè)試圖片,0.jpg是正常的,broke.jpg是手動(dòng)刪掉一點(diǎn)內(nèi)容后異常的:

腳本運(yùn)行結(jié)果:

代碼如下:
def is_valid_image(path):
'''
檢查文件是否損壞
'''
try:
bValid = True
fileObj = open(path, 'rb') # 以二進(jìn)制形式打開(kāi)
buf = fileObj.read()
if not buf.startswith(b'\xff\xd8'): # 是否以\xff\xd8開(kāi)頭
bValid = False
elif buf[6:10] in (b'JFIF', b'Exif'): # “JFIF”的ASCII碼
if not buf.rstrip(b'\0\r\n').endswith(b'\xff\xd9'): # 是否以\xff\xd9結(jié)尾
bValid = False
else:
try:
Image.open(fileObj).verify()
except Exception as e:
bValid = False
print(e)
except Exception as e:
return False
return bValid
flag1=is_valid_image(r'valid/0.jpg')
print(flag1)
flag1=is_valid_image(r'valid/broke.jpg')
print(flag1)
print ''
通過(guò)該腳本可以自動(dòng)的對(duì)圖片進(jìn)行校驗(yàn),后續(xù)是直接刪除還是將正常、損壞分開(kāi)就交給大家發(fā)揮啦;
圖片后綴與實(shí)際類型匹配檢驗(yàn)
我相信很多同學(xué)都有和我一樣的習(xí)慣,在jpg不滿足要求是,手動(dòng)改為png,實(shí)際上大多數(shù)情況下,這種方式是可行的,但是在類型為gif等時(shí),是無(wú)法直接打開(kāi)的,這個(gè)需求的來(lái)源是我通過(guò)itchat做的自動(dòng)微信內(nèi)容備份工具
在下載聊天中的圖片時(shí),經(jīng)常會(huì)下載到gif但是實(shí)際為jpg或者png的情況,這就導(dǎo)致這些圖片無(wú)法直接展示,且需要手動(dòng)改回實(shí)際類型,因此有了下面這個(gè)腳本;
類型校驗(yàn)轉(zhuǎn)換前:

校驗(yàn)log:

校驗(yàn)及轉(zhuǎn)換結(jié)果:

代碼如下:
def is_type_wrong(path):
'''
檢查文件后綴是否與實(shí)際對(duì)應(yīng),例如實(shí)際是jpg,后綴是gif,導(dǎo)致打不開(kāi)
'''
print path
real_type = path[path.rfind('.')+1:]
print real_type
if path.lower().endswith('.gif') or path.lower().endswith('.jpg') or path.lower().endswith('.png'):
header = []
with open(path, 'rb') as f:
while(len(header)<5):
header.append(f.read(1))
print header
tmp = real_type
if (header[0] == '\x47' and header[1] and '\x49' and header[2] == '\x46' and header[3] == '\x38'):
tmp = 'gif'
if (header[0] == '\xff' and header[1] == '\xd8'):
tmp = 'jpg'
if (header[0] == '\x89' and header[1] == '\x50' and header[2] == '\x4e' and header[3] == '\x47' and header[4] == '\x0D'):
tmp = 'png'
print tmp
if real_type != tmp:
return True,tmp
return False,real_type
if __name__ == '__main__':
is_wrong,real_type=is_type_wrong('type/1.gif')
if is_wrong:
os.system('cp type/1.gif type/1.'+real_type)
is_wrong,real_type=is_type_wrong('type/2.gif')
if is_wrong:
os.system('cp type/2.gif type/2.'+real_type)
is_wrong,real_type=is_type_wrong('type/3.gif')
if is_wrong:
os.system('cp type/3.gif type/3.'+real_type)
is_wrong,real_type=is_type_wrong('type/4.gif')
if is_wrong:
os.system('cp type/4.gif type/4.'+real_type)
通過(guò)該腳本,可以自動(dòng)的對(duì)圖片的后綴以及其實(shí)際類型進(jìn)行校驗(yàn),配合linux的cp、mv等命令很容易的實(shí)現(xiàn)圖片類型修正的功能,還是挺有用的感覺(jué);
小結(jié)
實(shí)際上這兩個(gè)腳本的運(yùn)行都是依賴于圖片文件自身具備的格式,對(duì)其固定格式進(jìn)行檢查,實(shí)現(xiàn)完整性、正確性的檢驗(yàn),大家也可以嘗試這進(jìn)行手動(dòng)的修改類型,比如jpg改為png,手動(dòng)損壞一個(gè)圖片文件,比如直接txt打開(kāi)后刪掉一段即可來(lái)試試看哈;
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- python實(shí)現(xiàn)圖像檢索的三種(直方圖/OpenCV/哈希法)
- Python Opencv任意形狀目標(biāo)檢測(cè)并繪制框圖
- opencv python 圖像輪廓/檢測(cè)輪廓/繪制輪廓的方法
- python opencv實(shí)現(xiàn)圖像邊緣檢測(cè)
- Python學(xué)習(xí)筆記之圖片人臉檢測(cè)識(shí)別實(shí)例教程
- Python基于matplotlib畫(huà)箱體圖檢驗(yàn)異常值操作示例【附xls數(shù)據(jù)文件下載】
- python用10行代碼實(shí)現(xiàn)對(duì)黃色圖片的檢測(cè)功能
- 用Python實(shí)現(xiàn)通過(guò)哈希算法檢測(cè)圖片重復(fù)的教程
相關(guān)文章
pandas報(bào)錯(cuò)AttributeError: DataFrame object has&
這篇文章主要介紹了pandas報(bào)錯(cuò)AttributeError: DataFrame object has no attribute ix問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02
Python實(shí)現(xiàn)自動(dòng)計(jì)算Excel數(shù)據(jù)指定范圍內(nèi)的區(qū)間最大值
這篇文章主要為大家詳細(xì)介紹了如何基于Python自動(dòng)計(jì)算Excel數(shù)據(jù)指定范圍內(nèi)的區(qū)間最大值,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以了解下2023-07-07
Django實(shí)現(xiàn)auth模塊下的登錄注冊(cè)與注銷功能
這篇文章主要介紹了Django實(shí)現(xiàn)auth模塊下的登錄注冊(cè)與注銷功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10
Python實(shí)現(xiàn)繪制雙柱狀圖并顯示數(shù)值功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)繪制雙柱狀圖并顯示數(shù)值功能,涉及Python數(shù)值運(yùn)算及基于matplotlib的圖形繪制相關(guān)操作技巧,需要的朋友可以參考下2018-06-06
Python中random.shuffle()函數(shù)用法代碼案例
random.shuffle方法,對(duì)元素進(jìn)行重新排序,打亂原有的順序,返回一個(gè)隨機(jī)序列,該方法的作用類似洗牌,本文重點(diǎn)給大家介紹Python中random.shuffle()函數(shù)用法代碼案例,感興趣的朋友跟隨小編一起看看吧2022-11-11
Python實(shí)現(xiàn)讀取目錄所有文件的文件名并保存到txt文件代碼
這篇文章主要介紹了Python實(shí)現(xiàn)讀取目錄所有文件的文件名并保存到txt文件代碼,本文分別使用os.listdir和os.walk實(shí)現(xiàn)給出兩段實(shí)現(xiàn)代碼,需要的朋友可以參考下2014-11-11

