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中的yield浅析
Jun 16 Python
python中执行shell命令的几个方法小结
Sep 18 Python
使用FastCGI部署Python的Django应用的教程
Jul 22 Python
对Python进行数据分析_关于Package的安装问题
May 22 Python
python合并已经存在的sheet数据到新sheet的方法
Dec 11 Python
用Python绘制漫步图实例讲解
Feb 26 Python
Keras预训练的ImageNet模型实现分类操作
Jul 07 Python
python飞机大战游戏实例讲解
Dec 04 Python
如何通过python检查文件是否被占用
Dec 18 Python
Python实现疫情地图可视化
Feb 05 Python
python基于selenium爬取斗鱼弹幕
Feb 20 Python
超级详细实用的pycharm常用快捷键
May 12 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 无法加载mcrypt.dll的解决办法
2013/04/03 PHP
tp5(thinkPHP5框架)captcha验证码配置及验证操作示例
2019/05/28 PHP
Javascript实例教程(19) 使用HoTMetal(2)
2006/12/23 Javascript
xml分页+ajax请求数据源+dom取结果实例代码
2008/10/31 Javascript
JS无限树状列表实现代码
2011/01/11 Javascript
分享精心挑选的12款优秀jQuery Ajax分页插件和教程
2012/08/09 Javascript
JS 有趣的eval优化输入验证实例代码
2013/09/22 Javascript
js加载之使用DOM方法动态加载Javascript文件
2013/11/08 Javascript
jquery.ajax的url中传递中文乱码问题的解决方法
2014/02/07 Javascript
jquery实现的随机多彩tag标签随机颜色和字号大小效果
2014/03/27 Javascript
js获取日期:昨天今天和明天、后天
2014/06/11 Javascript
JS模拟键盘打字效果的方法
2015/08/05 Javascript
jquery中ajax处理跨域的三大方式
2016/01/05 Javascript
基于javascript实现图片滑动效果
2016/05/07 Javascript
Javascript中获取浏览器类型和操作系统版本等客户端信息常用代码
2016/06/28 Javascript
jquery 动态增加删除行的简单实例(推荐)
2016/10/12 Javascript
Vue.js第三天学习笔记(计算属性computed)
2016/12/01 Javascript
详解网站中图片日常使用以及优化手法
2017/01/09 Javascript
Vue实现typeahead组件功能(非常靠谱)
2017/08/26 Javascript
深入理解Vue 单向数据流的原理
2017/11/09 Javascript
vue-router中的hash和history两种模式的区别
2018/07/17 Javascript
vue-router判断页面未登录自动跳转到登录页的方法示例
2018/11/04 Javascript
小程序开发中如何使用async-await并封装公共异步请求的方法
2019/01/20 Javascript
JavaScript动态创建二维数组的方法示例
2019/02/01 Javascript
Handtrack.js库实现实时监测手部运动(推荐)
2021/02/08 Javascript
Django如何在不停机的情况下创建索引
2020/08/02 Python
Python Web项目Cherrypy使用方法镜像
2020/11/05 Python
中国宠物用品商城:E宠商城
2016/08/27 全球购物
美国在线购买和出售礼品卡网站:EJ Gift Cards
2019/06/09 全球购物
民生工程实施方案
2014/03/22 职场文书
党的生日活动方案
2014/08/15 职场文书
2014年协会工作总结
2014/11/22 职场文书
2015年公民道德宣传日活动总结
2015/03/23 职场文书
2015年安全月活动总结
2015/03/26 职场文书
Python基础之条件语句详解
2021/06/16 Python
windows server2016安装oracle 11g的图文教程
2022/07/15 Servers