Python检查图片是否损坏及图片类型是否正确过程详解

江屿
江屿
发布时间:2026-10-13 | 6人浏览过
原创

本文介绍两个Python脚本,分别用于检测图片文件是否损坏以及校验图片后缀与实际格式是否一致。通过读取文件头字节特征,自动识别JPG、PNG、GIF等格式,并处理因下载或手动修改导致的类型错误问题,帮助批量修正图片文件。

检查图片是否损坏

检查图片是否损坏

在日常工作中,经常需要处理大量图片。然而,在图片下载或解压过程中,文件可能会发生损坏。如果逐一手动点击检查,效率极低且不够优雅。因此,编写一个自动化检查脚本显得尤为必要。

测试用的图片包括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的情况,导致图片无法直接展示,需手动修正后缀。因此,开发了以下校验脚本。

类型校验转换前的状态示例。

校验日志输出如下。

校验及转换后的结果展示。

相关实现代码如下。


  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,或手动损坏图片文件(如用文本编辑器打开后删除部分数据)来验证脚本效果。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表