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 相关文章推荐
urllib2自定义opener详解
Feb 07 Python
python实现多线程的两种方式
May 22 Python
详解Python 序列化Serialize 和 反序列化Deserialize
Aug 20 Python
简单学习Python多进程Multiprocessing
Aug 29 Python
对pandas里的loc并列条件索引的实例讲解
Nov 15 Python
对Python3+gdal 读取tiff格式数据的实例讲解
Dec 04 Python
对python调用RPC接口的实例详解
Jan 03 Python
使用Python将字符串转换为格式化的日期时间字符串
Sep 01 Python
通过实例了解python property属性
Nov 01 Python
浅谈ROC曲线的最佳阈值如何选取
Feb 28 Python
解决jupyter notebook打不开无反应 浏览器未启动的问题
Apr 10 Python
python之PySide2安装使用及QT Designer UI设计案例教程
Jul 26 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
做一个有下拉功能的留言版
2006/10/09 PHP
基于PHP Socket配置以及实例的详细介绍
2013/06/13 PHP
php中hashtable实现示例分享
2014/02/13 PHP
PHP将回调函数作用到给定数组单元的方法
2014/08/19 PHP
php5.4传引用时报错问题分析
2016/01/22 PHP
jquery HotKeys轻松搞定键盘事件代码
2008/08/30 Javascript
jquery下将选择的checkbox的id组成字符串的方法
2010/11/28 Javascript
jquery批量控制form禁用的代码
2013/08/06 Javascript
jQuery中size()方法用法实例
2014/12/27 Javascript
JavaScript中的标签语句用法分析
2015/02/10 Javascript
JavaScript把数组作为堆栈使用的方法
2015/03/20 Javascript
jQuery中$.extend()用法实例
2015/06/24 Javascript
JQuery中ajax方法访问web服务实例
2015/07/18 Javascript
JS实现带有3D立体感的银灰色竖排折叠菜单代码
2015/10/20 Javascript
详解node.js搭建代理服务器请求数据
2017/04/08 Javascript
Vuex之理解state的用法实例
2017/04/19 Javascript
JavaScript的继承实现小结
2017/05/07 Javascript
在vue项目创建的后初始化首次使用stylus安装方法分享
2018/01/25 Javascript
vue2.0 资源文件assets和static的区别详解
2018/04/08 Javascript
详解小程序原生使用ES7 async/await语法
2018/08/06 Javascript
vue 设置 input 为不可以编辑的实现方法
2019/09/19 Javascript
Python获取apk文件URL地址实例
2013/11/01 Python
全面解读Python Web开发框架Django
2014/06/30 Python
python通过pil模块将raw图片转换成png图片的方法
2015/03/16 Python
python学习之编写查询ip程序
2016/02/27 Python
Python实现带百分比的进度条
2016/06/28 Python
Python实现对字符串的加密解密方法示例
2017/04/29 Python
python中模块查找的原理与方法详解
2017/08/11 Python
Python基于time模块求程序运行时间的方法
2017/09/18 Python
15行Python代码带你轻松理解令牌桶算法
2018/03/21 Python
python 接收处理外带的参数方法
2018/12/03 Python
Python----数据预处理代码实例
2019/03/20 Python
python中id函数运行方式
2020/07/03 Python
纪检干部先进事迹材料
2014/08/23 职场文书
4S店客服专员岗位职责
2015/04/07 职场文书
Python实现双向链表基本操作
2022/05/25 Python