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实现定时任务
Feb 08 Python
Python PyQt5标准对话框用法示例
Aug 23 Python
python判断字符串是否是json格式方法分享
Nov 07 Python
人生苦短我用python python如何快速入门?
Mar 12 Python
python3 requests中使用ip代理池随机生成ip的实例
May 07 Python
Flask框架WTForm表单用法示例
Jul 20 Python
搞清楚 Python traceback的具体使用方法
May 13 Python
给大家整理了19个pythonic的编程习惯(小结)
Sep 25 Python
python微信公众号开发简单流程实现
Mar 09 Python
解决Django部署设置Debug=False时xadmin后台管理系统样式丢失
Apr 07 Python
python实现猜单词游戏
May 22 Python
Python爬虫scrapy框架Cookie池(微博Cookie池)的使用
Jan 13 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
PHP 面向对象实现代码
2009/11/11 PHP
PHP YII框架开发小技巧之模型(models)中rules自定义验证规则
2015/11/16 PHP
php使用Jpgraph创建3D饼形图效果示例
2017/02/15 PHP
JavaScript 版本自动生成文章摘要
2008/07/23 Javascript
JS和jquery获取各种屏幕的宽度和高度的代码
2013/08/02 Javascript
跟我学习javascript的this关键字
2020/05/28 Javascript
你所未知的3种Node.js代码优化方式
2016/02/25 Javascript
jQuery实现移动端手机商城购物车功能
2016/09/24 Javascript
微信小程序 数据绑定详解及实例
2016/10/25 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的方法
2016/11/29 Javascript
Bootstrap源码解读下拉菜单(4)
2016/12/23 Javascript
微信小程序 页面跳转传值实现代码
2017/07/27 Javascript
BootStrap 页签切换失效的解决方法
2017/08/17 Javascript
node实现定时发送邮件的示例代码
2017/08/26 Javascript
ES6之模版字符串的具体使用
2018/05/17 Javascript
Vue数据双向绑定原理及简单实现方法
2018/05/18 Javascript
微信小程序实现保存图片到相册功能
2018/11/30 Javascript
如何在Angular应用中创建包含组件方法示例
2019/03/23 Javascript
微信小程序判断用户是否需要再次授权获取个人信息
2019/07/18 Javascript
vue路由守卫及路由守卫无限循环问题详析
2019/09/05 Javascript
对vue中的事件穿透与禁止穿透实例详解
2019/10/28 Javascript
pycharm 使用心得(八)如何调用另一文件中的函数
2014/06/06 Python
python交互式图形编程实例(三)
2017/11/17 Python
Python简单实现网页内容抓取功能示例
2018/06/07 Python
python中datetime模块中strftime/strptime函数的使用
2018/07/03 Python
Python 实现「食行生鲜」签到领积分功能
2018/09/26 Python
python Selenium 库的使用技巧
2020/10/16 Python
python实现简单猜单词游戏
2020/12/24 Python
夜大毕业自我鉴定
2013/10/11 职场文书
家居装修公司创业计划书范文
2014/03/20 职场文书
月度优秀员工获奖感言
2014/08/16 职场文书
写给医生的感谢信
2015/01/22 职场文书
安全教育第一课观后感
2015/06/17 职场文书
2015年第31个教师节致辞
2015/07/31 职场文书
家长必看:义务教育,不得以面试 评测等名义选拔学生
2019/07/09 职场文书