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实现带声音的摩斯码翻译实现方法
May 20 Python
解决pyqt中ui编译成窗体.py中文乱码的问题
Dec 23 Python
Python利用itchat对微信中好友数据实现简单分析的方法
Nov 21 Python
Python元组及文件核心对象类型详解
Feb 11 Python
Numpy中的mask的使用
Jul 21 Python
python通过http下载文件的方法详解
Jul 26 Python
python使用正则表达式(Regular Expression)方法超详细
Dec 30 Python
如何学习Python time模块
Jun 03 Python
pandas DataFrame运算的实现
Jun 14 Python
python如何实现图片压缩
Sep 11 Python
python两种获取剪贴板内容的方法
Nov 06 Python
python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析
Apr 14 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
PHP网站提速三大“软”招
2006/10/09 PHP
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
2011/08/18 PHP
php分页代码学习示例分享
2014/02/20 PHP
深入理解JavaScript系列(6) 强大的原型和原型链
2012/01/15 Javascript
jquery 操作DOM案例代码分享
2012/04/05 Javascript
使用js对select动态添加和删除OPTION示例代码
2013/08/12 Javascript
使用JS或jQuery模拟鼠标点击a标签事件代码
2014/03/10 Javascript
jQuery标签替换函数replaceWith()的使用例子
2014/08/28 Javascript
jquery中animate的stop()方法作用实例分析
2015/01/30 Javascript
JS控制网页动态生成任意行列数表格的方法
2015/03/09 Javascript
JS+CSS实现自适应选项卡宽度的圆角滑动门效果
2015/09/15 Javascript
jquery代码规范让代码越来越好看
2017/02/03 Javascript
discuz表情的JS提取方法分析
2017/03/22 Javascript
浅谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/27 Javascript
JavaScript实现点击出现图片并统计点击次数功能示例
2018/07/23 Javascript
在Vue methods中调用filters里的过滤器实例
2018/08/30 Javascript
jQuery选择器选中最后一个元素,倒数第二个元素操作示例
2018/12/10 jQuery
解决 viewer.js 动态更新图片导致无法预览的问题
2019/05/14 Javascript
微信小程序实现类似微信点击语音播放效果
2020/03/30 Javascript
原生JS与CSS实现软件卸载对话框功能
2019/12/05 Javascript
JavaScript布尔运算符原理使用解析
2020/05/06 Javascript
原生js实现自定义滚动条组件
2021/01/20 Javascript
Python实现备份文件实例
2014/09/16 Python
Python编程之微信推送模板消息功能示例
2017/08/21 Python
基于python中的TCP及UDP(详解)
2017/11/06 Python
Python中if elif else及缩进的使用简述
2018/05/31 Python
python中的二维列表实例详解
2018/06/19 Python
对python3中, print横向输出的方法详解
2019/01/28 Python
Python实现FTP文件定时自动下载的步骤
2020/12/19 Python
捷克电器和DJ设备网上商店:Electronic-star
2017/07/18 全球购物
应用电子技术专业个人求职信
2013/09/21 职场文书
上课看小说检讨书
2014/02/22 职场文书
自我鉴定总结
2014/03/24 职场文书
2014年教育教学工作总结
2014/11/13 职场文书
这样写python注释让代码更加的优雅
2021/06/02 Python
springboot集成flyway自动创表的详细配置
2021/06/26 Java/Android