1. 程式人生 > 程式設計 >Python檢查圖片是否損壞及圖片型別是否正確過程詳解

Python檢查圖片是否損壞及圖片型別是否正確過程詳解

檢查圖片是否損壞

日常工作中,時常會需要用到圖片,有時候圖片在下載、解壓過程中會損壞,而如果一張一張點選來檢查就太不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'\xff\xd8'): # 是否以\xff\xd8開頭
        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結尾
          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開啟後刪掉一段即可來試試看哈;

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。