檢查圖片是否損壞、圖片後綴是否與實際圖片類型對應 - Python

  • 2019 年 10 月 3 日
  • 筆記

圖片工具

檢查圖片是否損壞

日常工作中,時常會需要用到圖片,有時候圖片在下載、解壓過程中會損壞,而如果一張一張點擊來檢查就太不Cool了,因此我想大家都需要一個檢查腳本;

測試圖片,0.jpg是正常的,broke.jpg是手動刪掉一點內容後異常的:

腳本運行結果:

程式碼如下:

    # 從本地判斷圖片是否損壞      def is_valid_image(path):          '''          檢查文件是否損壞          '''          try:              bValid = True              fileObj = open(path, 'rb')  # 以二進位形式打開              buf = fileObj.read()              if not buf.startswith(b'xffxd8'):  # 是否以xffxd8開頭                  bValid = False              elif buf[6:10] in (b'JFIF', b'Exif'):  # 「JFIF」的ASCII碼                  if not buf.rstrip(b'rn').endswith(b'xffxd9'):  # 是否以xffxd9結尾                      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 ''

通過該腳本可以自動的對圖片進行校驗,後續是直接刪除還是將正常、損壞分開就交給大家發揮啦;

圖片後綴與實際類型匹配檢驗

我相信很多同學都有和我一樣的習慣,在jpg不滿足要求是,手動改為png,實際上大多數情況下,這種方式是可行的,但是在類型為gif等時,是無法直接打開的,這個需求的來源是我通過itchat做的自動微信內容備份工具
在下載聊天中的圖片時,經常會下載到gif但是實際為jpg或者png的情況,這就導致這些圖片無法直接展示,且需要手動改回實際類型,因此有了下面這個腳本;

類型校驗轉換前:

校驗log:

校驗及轉換結果:

程式碼如下:

    def is_type_wrong(path):          '''          檢查文件後綴是否與實際對應,例如實際是jpg,後綴是gif,導致打不開          '''          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)

通過該腳本,可以自動的對圖片的後綴以及其實際類型進行校驗,配合linux的cp、mv等命令很容易的實現圖片類型修正的功能,還是挺有用的感覺;

小結

實際上這兩個腳本的運行都是依賴於圖片文件自身具備的格式,對其固定格式進行檢查,實現完整性、正確性的檢驗,大家也可以嘗試這進行手動的修改類型,比如jpg改為png,手動損壞一個圖片文件,比如直接txt打開後刪掉一段即可來試試看哈;

最後

大家可以到我的Github上看看有沒有其他需要的東西,目前主要是自己做的機器學習項目、Python各種腳本工具、數據分析挖掘項目以及Follow的大佬、Fork的項目等:
https://github.com/NemoHoHaloAi

Tags: