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多线程爬虫爬取电影天堂资源
Sep 23 Python
Python实现屏幕截图的代码及函数详解
Oct 01 Python
python中set()函数简介及实例解析
Jan 09 Python
Flask核心机制之上下文源码剖析
Dec 25 Python
解决python中画图时x,y轴名称出现中文乱码的问题
Jan 29 Python
Python向excel中写入数据的方法
May 05 Python
Python button选取本地图片并显示的实例
Jun 13 Python
python对文件目录的操作方法实例总结
Jun 24 Python
在pytorch中为Module和Tensor指定GPU的例子
Aug 19 Python
关于django 1.10 CSRF验证失败的解决方法
Aug 31 Python
Opencv 图片的OCR识别的实战示例
Mar 02 Python
Python制作表白爱心合集
Jan 22 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
php5.3中连接sqlserver2000的两种方法(com与ODBC)
2012/12/29 PHP
php多文件上传下载示例分享
2014/02/20 PHP
php的sso单点登录实现方法
2015/01/08 PHP
Linux系统递归生成目录中文件的md5的方法
2015/06/29 PHP
php中文语义分析实现方法示例
2019/09/28 PHP
深入理解JavaScript中的传值与传引用
2013/12/09 Javascript
js中window.open()的所有参数详细解析
2014/01/09 Javascript
JS批量修改PS中图层名称的方法
2014/01/26 Javascript
Js表格万条数据瞬间加载实现代码
2014/02/20 Javascript
jQuery队列操作方法实例
2014/06/11 Javascript
JavaScript采用递归算法计算阶乘实例
2015/08/04 Javascript
javascript数组去重小结
2016/03/07 Javascript
vue中用H5实现文件上传的方法实例代码
2017/05/27 Javascript
angular实现spa单页面应用实例
2017/07/10 Javascript
jquery鼠标悬停导航下划线滑出效果
2017/09/29 jQuery
基于jQuery的$.getScript方法去加载javaScript文档解析
2017/11/08 jQuery
vue2.0使用swiper组件实现轮播效果
2017/11/27 Javascript
Vue.set()实现数据动态响应的方法
2018/02/07 Javascript
JS页面获取 session 值,作用域和闭包学习笔记
2019/10/16 Javascript
python实现微信自动回复及批量添加好友功能
2019/07/03 Python
python+selenium 鼠标事件操作方法
2019/08/24 Python
Pytorch evaluation每次运行结果不同的解决
2020/01/02 Python
python框架flask入门之路由及简单实现方法
2020/06/07 Python
Django model重写save方法及update踩坑详解
2020/07/27 Python
Python 串口通信的实现
2020/09/29 Python
HelloFresh澳大利亚:订购你的美味食品盒、健康餐食
2018/03/28 全球购物
Bloomingdale’s阿联酋:选购奢华时尚、美容及更多
2020/09/22 全球购物
String和StringBuffer的区别
2015/08/13 面试题
老龄工作先进事迹
2014/08/15 职场文书
领导干部作风整顿个人剖析材料
2014/10/11 职场文书
团组织推优材料
2014/12/29 职场文书
担保书范本
2015/01/20 职场文书
运动会通讯稿50字
2015/07/20 职场文书
警用民用对讲机找不同
2022/02/18 无线电
Python内置的数据类型及使用方法
2022/04/13 Python
浅析JavaScript中的变量提升
2022/06/01 Javascript