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读取csv文件示例(python操作csv)
Mar 11 Python
Python中的rfind()方法使用详解
May 19 Python
python调用fortran模块
Apr 08 Python
机器学习经典算法-logistic回归代码详解
Dec 22 Python
python实现机器人行走效果
Jan 29 Python
Python面向对象基础入门之设置对象属性
Dec 11 Python
Python使用crontab模块设置和清除定时任务操作详解
Apr 09 Python
Python对ElasticSearch获取数据及操作
Apr 24 Python
关于不懂Chromedriver如何配置环境变量问题解决方法
Jun 12 Python
python字符串的index和find的区别详解
Jun 20 Python
如何利用python生成MD5并去重
Dec 07 Python
只用20行Python代码实现屏幕录制功能
Jun 02 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数组函数序列之prev() - 移动数组内部指针到上一个元素的位置,并返回该元素值
2011/10/31 PHP
PHP中使用addslashes函数转义的安全性原理分析
2014/11/03 PHP
PHP上传文件参考配置大文件上传
2015/12/16 PHP
在TP5数据库中四个字段实现无限分类的示例
2019/10/18 PHP
jMessageBox 基于jQuery的窗口插件
2009/12/09 Javascript
一个简单的js鼠标划过切换效果
2010/06/30 Javascript
浅谈JQ中mouseover和mouseenter的区别
2016/09/13 Javascript
JQuery PHP图片在线裁剪实例
2020/07/27 Javascript
通过图带你深入了解vue的响应式原理
2019/06/21 Javascript
如何在Node和浏览器控制台中打印彩色文字
2020/01/09 Javascript
[54:51]Ti4 冒泡赛第二轮LGD vs C9 3
2014/07/14 DOTA
Python def函数的定义、使用及参数传递实现代码
2014/08/10 Python
跟老齐学Python之数据类型总结
2014/09/24 Python
单链表反转python实现代码示例
2018/02/08 Python
Python实现一个服务器监听多个客户端请求
2018/04/12 Python
Django 路由系统URLconf的使用
2018/10/11 Python
python 使用值来排序一个字典的方法
2018/11/16 Python
对Python实现累加函数的方法详解
2019/01/23 Python
如何使用django的MTV开发模式返回一个网页
2019/07/22 Python
PyTorch预训练的实现
2019/09/18 Python
已安装tensorflow-gpu,但keras无法使用GPU加速的解决
2020/02/07 Python
Python实现对adb命令封装
2020/03/06 Python
django正续或者倒序查库实例
2020/05/19 Python
使用Numpy对特征中的异常值进行替换及条件替换方式
2020/06/08 Python
python 实现简易的记事本
2020/11/30 Python
python-图片流传输的思路及示例(url转换二维码)
2020/12/21 Python
一套Java笔试题
2016/08/20 面试题
质检员岗位职责
2013/12/17 职场文书
预备党员思想汇报
2014/01/08 职场文书
事业单位公务员的职业生涯规划
2014/01/15 职场文书
骨干教师培训感言
2014/01/16 职场文书
个人自我鉴定总结
2014/03/25 职场文书
补充协议书范本
2014/04/23 职场文书
经济类毕业生求职信
2014/06/26 职场文书
商家认证委托书格式
2014/10/16 职场文书
幼儿园老师个人总结
2015/02/28 职场文书