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库安装包下载地址与安装过程详细介绍(Windows版)
Nov 02 Python
python判断字符串是否是json格式方法分享
Nov 07 Python
Python 类的特殊成员解析
Jun 20 Python
基于树莓派的语音对话机器人
Jun 17 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
Oct 17 Python
python实现智能语音天气预报
Dec 02 Python
解决tensorboard多个events文件显示紊乱的问题
Feb 15 Python
python实现滑雪游戏
Feb 22 Python
Python文件操作基础流程解析
Mar 19 Python
python实现IOU计算案例
Apr 12 Python
基于python实现生成指定大小txt文档
Jul 20 Python
python自动获取微信公众号最新文章的实现代码
Jul 15 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脚本数据库功能详解(下)
2006/10/09 PHP
php保存信息到当前Session的方法
2015/03/16 PHP
phpMyAdmin无法登陆的解决方法
2017/04/27 PHP
js实现简单登录功能的实例代码
2013/11/09 Javascript
基于jquery实现的自动补全功能
2015/03/12 Javascript
freemarker判断对象是否为空的方法
2015/08/13 Javascript
jQuery中cookie插件用法实例分析
2015/12/04 Javascript
jquery判断iPhone、Android设备类型
2016/09/14 Javascript
vue 怎么创建组件及组件使用方法
2017/07/27 Javascript
详解npm 配置项registry修改为淘宝镜像
2018/09/07 Javascript
Python脚本实现格式化css文件
2015/04/08 Python
python增加矩阵维度的实例讲解
2018/04/04 Python
Python实现iOS自动化打包详解步骤
2018/10/03 Python
Python多进程方式抓取基金网站内容的方法分析
2019/06/03 Python
一篇文章弄懂Python中的可迭代对象、迭代器和生成器
2019/08/12 Python
springboot配置文件抽离 git管理统 配置中心详解
2019/09/02 Python
使用Rasterio读取栅格数据的实例讲解
2019/11/26 Python
python3中的logging记录日志实现过程及封装成类的操作
2020/05/12 Python
浅谈numpy中np.array()与np.asarray的区别以及.tolist
2020/06/03 Python
python向企业微信发送文字和图片消息的示例
2020/09/28 Python
html5如何在Canvas中实现自定义路径动画示例
2017/09/18 HTML / CSS
美国礼品卡交易网站:Cardpool
2018/08/27 全球购物
白俄罗斯大卖场:21vek.by
2019/07/25 全球购物
英国买鞋网站:Charles Clinkard
2019/11/14 全球购物
戴尔荷兰官方网站:Dell荷兰
2020/10/04 全球购物
必须要使用游标的SQL语句有那些
2012/05/07 面试题
工程师自我评价怎么写
2013/09/19 职场文书
校园学雷锋活动月总结
2014/03/09 职场文书
个人综合鉴定材料
2014/05/23 职场文书
2014年大学学生会工作总结
2014/12/02 职场文书
员工离职证明范本
2015/06/12 职场文书
《颐和园》教学反思
2016/02/19 职场文书
idea编译器vue缩进报错问题场景分析
2021/07/04 Vue.js
Redis RDB技术底层原理详解
2021/09/04 Redis
Python实现归一化算法详情
2022/03/18 Python
解决flex布局中子项目尺寸不受flex-shrink限制
2022/05/11 HTML / CSS