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列表的常用操作方法小结
May 21 Python
利用Python爬虫给孩子起个好名字
Feb 14 Python
python批量修改文件编码格式的方法
May 31 Python
对numpy中的数组条件筛选功能详解
Jul 02 Python
python用opencv批量截取图像指定区域的方法
Jan 24 Python
Python使用Pickle模块进行数据保存和读取的讲解
Apr 09 Python
对Python中class和instance以及self的用法详解
Jun 26 Python
python 一个figure上显示多个图像的实例
Jul 08 Python
Python八皇后问题解答过程详解
Jul 29 Python
Python进阶之使用selenium爬取淘宝商品信息功能示例
Sep 16 Python
Python使用configparser读取ini配置文件
May 25 Python
Django中Q查询及Q()对象 F查询及F()对象用法
Jul 09 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求正负数数组中连续元素最大值示例
2014/04/11 PHP
ThinkPHP标签制作教程
2014/07/10 PHP
php求一个网段开始与结束IP地址的方法
2015/07/09 PHP
Extjs Ext.MessageBox.confirm 确认对话框详解
2010/04/02 Javascript
JQuery中$.ajax()方法参数详解及应用
2013/12/12 Javascript
jQuery 中国省市两级联动选择附图
2014/05/14 Javascript
Javascript实现简单的富文本编辑器附演示
2014/06/16 Javascript
input标签内容改变的触发事件介绍
2014/06/18 Javascript
JQuery 给元素绑定click事件多次执行的解决方法
2014/09/09 Javascript
JavaScript实现鼠标滑过图片变换效果的方法
2015/04/16 Javascript
jQuery简单实现input文本框内灰色提示文本效果的方法
2015/12/02 Javascript
简介BootStrap model弹出框的使用
2016/04/27 Javascript
前端js文件合并的三种方式推荐
2016/05/19 Javascript
有关JavaScript中call()和apply() 的一些理解
2016/05/20 Javascript
javascript实现消灭星星小游戏简单版
2016/11/15 Javascript
浅析Ajax语法
2016/12/05 Javascript
鼠标点击input,显示瞬间的边框颜色,对之修改与隐藏实例
2016/12/26 Javascript
NodeJs测试框架Mocha的安装与使用
2017/03/28 NodeJs
JS触摸与手势事件详解
2017/05/09 Javascript
vant IndexBar实现的城市列表的示例代码
2019/11/20 Javascript
微信小程序自定义模态弹窗组件详解
2019/12/24 Javascript
一篇文章带你从零快速上手Rollup
2020/09/07 Javascript
[02:17]DOTA2亚洲邀请赛 RAVE战队出场宣传片
2015/02/07 DOTA
利用numpy和pandas处理csv文件中的时间方法
2018/04/19 Python
Django管理员账号和密码忘记的完美解决方法
2018/12/06 Python
Django启动时找不到mysqlclient问题解决方案
2020/11/11 Python
美化环境标语
2014/06/20 职场文书
团日活动总结怎么写
2014/06/25 职场文书
七夕相亲活动策划方案
2014/08/31 职场文书
车辆委托书范本
2014/10/05 职场文书
公司股份转让协议书范本
2015/01/28 职场文书
大学生暑期实践报告
2015/07/13 职场文书
搞笑欢迎词大全
2015/09/30 职场文书
Ajax实现局部刷新的方法实例
2021/03/31 Javascript
python实现求纯色彩图像的边框
2021/04/08 Python
MySQL Router的安装部署
2021/04/24 MySQL