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实战之实现excel读取、统计、写入的示例讲解
May 02 Python
Django Web开发中django-debug-toolbar的配置以及使用
May 06 Python
python实现抖音视频批量下载
Jun 20 Python
基于python实现自动化办公学习笔记(CSV、word、Excel、PPT)
Aug 06 Python
python输出数组中指定元素的所有索引示例
Dec 06 Python
Python如何基于selenium实现自动登录博客园
Dec 16 Python
Python tcp传输代码实例解析
Mar 18 Python
Pytorch损失函数nn.NLLLoss2d()用法说明
Jul 07 Python
python 动态渲染 mysql 配置文件的示例
Nov 20 Python
Python趣味实战之手把手教你实现举牌小人生成器
Jun 07 Python
Django+Nginx+uWSGI 定时任务的实现方法
Jan 22 Python
实战Python爬虫爬取酷我音乐
Apr 11 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/12/25 PHP
PHP对文件夹递归执行chmod命令的方法
2015/06/19 PHP
php微信开发自定义菜单
2016/08/27 PHP
PHP mysqli_free_result()与mysqli_fetch_array()函数详解
2016/09/21 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
php与js的区别是什么
2013/08/05 Javascript
javascript中取前n天日期的两种方法分享
2014/01/26 Javascript
javascript判断chrome浏览器的方法
2014/03/26 Javascript
容易造成JavaScript内存泄露几个方面
2014/09/04 Javascript
原生javascript实现图片滚动、延时加载功能
2015/01/12 Javascript
JavaScript实现更改网页背景与字体颜色的方法
2015/02/02 Javascript
深入浅析AngularJS中的module(模块)
2016/01/04 Javascript
Google 地图控件集详解及实例代码
2016/08/06 Javascript
node.js实现快速截图
2016/08/27 Javascript
JS实现仿PS的调色板效果完整实例
2016/12/21 Javascript
详解js中==与===的区别
2017/01/08 Javascript
JavaScript30 一个月纯 JS 挑战中文指南(英文全集)
2017/07/23 Javascript
jQuery zTree 异步加载添加子节点重复问题
2017/11/29 jQuery
vue bus全局事件中心简单Demo详解
2018/02/26 Javascript
Angular4 ElementRef的应用
2018/02/26 Javascript
基于javascript实现贪吃蛇小游戏
2019/11/25 Javascript
vue下axios拦截器token刷新机制的实例代码
2020/01/17 Javascript
探究一道价值25k的蚂蚁金服异步串行面试题
2020/08/21 Javascript
js属性对象的hasOwnProperty方法的使用
2021/02/05 Javascript
Python脚本实时处理log文件的方法
2016/11/21 Python
python下读取公私钥做加解密实例详解
2017/03/29 Python
对Python 除法负数取商的取整方式详解
2018/12/12 Python
python执行scp命令拷贝文件及文件夹到远程主机的目录方法
2019/07/08 Python
用HTML5.0制作网页的教程
2010/05/30 HTML / CSS
精彩的推荐信范文
2013/11/26 职场文书
2014幼儿园小班工作总结
2014/11/10 职场文书
优秀学生干部事迹材料
2014/12/24 职场文书
毕业实习计划书
2015/01/16 职场文书
贫困生证明范文
2015/06/16 职场文书
九九重阳节致辞
2015/07/31 职场文书
2016年少先队活动总结
2016/04/06 职场文书