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中迭代器(iterator)用法实例分析
Apr 29 Python
Python彩色化Linux的命令行终端界面的代码实例分享
Jul 02 Python
Python实现视频下载功能
Mar 14 Python
python try except返回异常的信息字符串代码实例
Aug 15 Python
python使用Matplotlib改变坐标轴的默认位置
Oct 18 Python
Python 支持向量机分类器的实现
Jan 15 Python
Django表单提交后实现获取相同name的不同value值
May 14 Python
Python urlopen()参数代码示例解析
Dec 10 Python
golang特有程序结构入门教程
Jun 02 Python
Python中使用ipython的详细教程
Jun 22 Python
Python OpenCV实现图像模板匹配详解
Apr 07 Python
python实现一个简单的贪吃蛇游戏附代码
Jun 28 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的autoLoad自动加载机制
2012/09/27 PHP
php使用get_class_methods()函数获取分类的方法
2016/07/20 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
常用js字符串判断方法整理
2013/10/18 Javascript
jQuery实现商品活动倒计时
2015/10/16 Javascript
用JavaScript来美化HTML的select标签的下拉列表效果
2015/11/17 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(一)
2015/12/10 Javascript
JavaScript限制在客户区可见范围的拖拽(解决scrollLeft和scrollTop的问题)(2)
2017/05/17 Javascript
JavaScript设计模式之策略模式详解
2017/06/09 Javascript
webpack进阶——缓存与独立打包的用法
2017/08/02 Javascript
关于vue.js发布后路径引用的问题解决
2017/08/15 Javascript
微信小程序页面滑动屏幕加载数据效果
2020/11/16 Javascript
基于jquery.page.js实现分页效果
2018/01/01 jQuery
JS的函数调用栈stack size的计算方法
2018/06/24 Javascript
vue.js提交按钮时进行简单的if判断表达式详解
2018/08/08 Javascript
通过layer实现可输入的模态框的例子
2019/09/27 Javascript
javascript实现fetch请求返回的统一拦截
2019/12/22 Javascript
javascript实现贪吃蛇游戏(娱乐版)
2020/08/17 Javascript
PYTHON 中使用 GLOBAL引发的一系列问题
2016/10/12 Python
Python处理PDF及生成多层PDF实例代码
2017/04/24 Python
django限制匿名用户访问及重定向的方法实例
2018/02/07 Python
python线程中的同步问题及解决方法
2019/08/29 Python
Python发送手机动态验证码代码实例
2020/02/28 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
2020/04/01 Python
Python pandas对excel的操作实现示例
2020/07/21 Python
Python 如何调试程序崩溃错误
2020/08/03 Python
python Scrapy框架原理解析
2021/01/04 Python
联想新加坡官方网站:Lenovo Singapore
2017/10/24 全球购物
迪卡侬中国官网:Decathlon中国
2020/08/10 全球购物
信号量和自旋锁的区别?如何选择使用?
2015/09/08 面试题
结构工程研究生求职信
2013/10/13 职场文书
员工考核评语大全
2014/04/26 职场文书
英文感谢信范文
2015/01/21 职场文书
生日宴会祝酒词
2015/08/10 职场文书
工伤调解协议书
2016/03/21 职场文书
goland 清除所有的默认设置操作
2021/04/28 Golang