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


Posted in Python onSeptember 30, 2019

检查图片是否损坏

日常工作中,时常会需要用到图片,有时候图片在下载、解压过程中会损坏,而如果一张一张点击来检查就太不Cool了,因此我想大家都需要一个检查脚本;

测试图片,0.jpg是正常的,broke.jpg是手动删掉一点内容后异常的:

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

脚本运行结果:

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

代码如下:

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的情况,这就导致这些图片无法直接展示,且需要手动改回实际类型,因此有了下面这个脚本;

类型校验转换前:

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

校验log:

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

校验及转换结果:

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

代码如下:

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打开后删掉一段即可来试试看哈;

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

Python 相关文章推荐
Python使用urllib模块的urlopen超时问题解决方法
Nov 08 Python
python写入中英文字符串到文件的方法
May 06 Python
Python实现图片转字符画的示例
Aug 22 Python
Django 忘记管理员或忘记管理员密码 重设登录密码的方法
May 30 Python
Python 经典面试题 21 道【不可错过】
Sep 21 Python
python实现简单的文字识别
Nov 27 Python
Python OpenCV对本地视频文件进行分帧保存的实例
Jan 08 Python
Python中的单下划线和双下划线使用场景详解
Sep 09 Python
pytorch masked_fill报错的解决
Feb 18 Python
详解Django中views数据查询使用locals()函数进行优化
Aug 24 Python
python从PDF中提取数据的示例
Oct 30 Python
PyTorch预训练Bert模型的示例
Nov 17 Python
Python3 合并二叉树的实现
Sep 30 #Python
自适应线性神经网络Adaline的python实现详解
Sep 30 #Python
softmax及python实现过程解析
Sep 30 #Python
python根据时间获取周数代码实例
Sep 30 #Python
Win10 安装PyCharm2019.1.1(图文教程)
Sep 29 #Python
PyCharm2019安装教程及其使用(图文教程)
Sep 29 #Python
Python 文件操作之读取文件(read),文件指针与写入文件(write),文件打开方式示例
Sep 29 #Python
You might like
通过Email发送PHP错误的方法
2015/07/20 PHP
JS基于HTML5的canvas标签实现炫目的色相球动画效果实例
2016/08/24 Javascript
详解JavaScript模块化开发
2016/12/04 Javascript
vue-resource 拦截器(interceptor)的使用详解
2017/07/04 Javascript
利用ECharts.js画K线图的方法示例
2018/01/10 Javascript
用jquery获取select标签中选中的option值及文本的示例
2018/01/25 jQuery
微信小程序实现上传图片功能
2018/05/28 Javascript
JavaScript对象拷贝与Object.assign用法实例分析
2018/06/20 Javascript
vue路由对不同界面进行传参及跳转的总结
2019/04/20 Javascript
浅谈Python2获取中文文件名的编码问题
2018/01/09 Python
利用python将json数据转换为csv格式的方法
2018/03/22 Python
Python txt文件加入字典并查询的方法
2019/01/15 Python
Python3获取拉勾网招聘信息的方法实例
2019/04/03 Python
使用python来调用CAN通讯的DLL实现方法
2019/07/03 Python
python输出决策树图形的例子
2019/08/09 Python
python破解bilibili滑动验证码登录功能
2019/09/11 Python
Python for循环及基础用法详解
2019/11/08 Python
python实现局域网内实时通信代码
2019/12/22 Python
python 使用递归回溯完美解决八皇后的问题
2020/02/26 Python
在PyCharm中遇到pip安装 失败问题及解决方案(pip失效时的解决方案)
2020/03/10 Python
Python如何将将模块分割成多个文件
2020/08/04 Python
Pycharm无法打开双击没反应的问题及解决方案
2020/08/17 Python
使用phonegap进行提示操作的具体方法
2017/03/30 HTML / CSS
亚马逊中国官方网站:amazon.cn
2017/05/25 全球购物
Athleta官网:购买女士瑜伽服、技术运动服和休闲运动服
2020/11/12 全球购物
入党思想汇报怎么写
2014/04/03 职场文书
职业生涯规划书前言
2014/04/15 职场文书
物流管理专业求职信
2014/05/29 职场文书
酒店总经理岗位职责范本
2014/08/08 职场文书
单位个人查摆问题及整改措施
2014/10/28 职场文书
2015年党员自我剖析材料
2014/12/17 职场文书
SQL语句中JOIN的用法场景分析
2021/07/25 SQL Server
PHP正则表达式之RCEService回溯
2022/04/11 PHP
Java后端 Dubbo retries 超时重试机制的解决方案
2022/04/14 Java/Android
Oracle锁表解决方法的详细记录
2022/06/05 Oracle
MySQL数据库如何查看表占用空间大小
2022/06/10 MySQL