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中执行shell的两种方法总结
Jan 10 Python
python3.6使用pymysql连接Mysql数据库
May 25 Python
python实现简单http服务器功能
Sep 17 Python
Python爬虫文件下载图文教程
Dec 23 Python
浅谈Python 多进程默认不能共享全局变量的问题
Jan 11 Python
在Python 中实现图片加框和加字的方法
Jan 26 Python
计算机二级python学习教程(3) python语言基本数据类型
May 16 Python
Python高级特性之闭包与装饰器实例详解
Nov 19 Python
开启Django博客的RSS功能的实现方法
Feb 17 Python
Python lambda表达式原理及用法解析
Aug 18 Python
基于Python爬取51cto博客页面信息过程解析
Aug 25 Python
Pyinstaller打包Scrapy项目的实现步骤
Sep 22 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
WordPress主题中添加文章列表页页码导航的PHP代码实例
2015/12/22 PHP
Zend Framework教程之Zend_Db_Table_Row用法实例分析
2016/03/21 PHP
PHPStrom 新建FTP项目以及在线操作教程
2016/10/16 PHP
JS动态添加option和删除option(附实例代码)
2013/04/01 Javascript
js获取时间(本周、本季度、本月..)
2013/11/22 Javascript
JavaScript使用shift方法移除素组第一个元素实例分析
2015/04/06 Javascript
jQuery实现切换页面过渡动画效果
2015/10/29 Javascript
基于Bootstrap实现Material Design风格表单插件 附源码下载
2016/04/18 Javascript
JavaScript中的对象和原型(一)
2016/08/12 Javascript
详解vue-cli脚手架build目录中的dev-server.js配置文件
2017/11/24 Javascript
vue中使用vue-router切换页面时滚动条自动滚动到顶部的方法
2017/11/28 Javascript
vue axios 二次封装的示例代码
2017/12/08 Javascript
Vue EventBus自定义组件事件传递
2018/06/25 Javascript
深入解析ES6中的promise
2018/11/08 Javascript
如何能分清npm cnpm npx nvm
2019/01/17 Javascript
基于Bootstrap和JQuery实现动态打开和关闭tab页的实例代码
2019/06/10 jQuery
java和js实现的洗牌小程序
2019/09/30 Javascript
[55:35]VGJ.S vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
在Python中使用HTML模版的教程
2015/04/29 Python
python编写简单爬虫资料汇总
2016/03/22 Python
Python实现随机生成有效手机号码及身份证功能示例
2017/06/05 Python
通过Python实现自动填写调查问卷
2017/09/06 Python
Python随机生成均匀分布在单位圆内的点代码示例
2017/11/13 Python
利用python实现在微信群刷屏的方法
2019/02/21 Python
Python爬虫 urllib2的使用方法详解
2019/09/23 Python
python批量将excel内容进行翻译写入功能
2019/10/10 Python
使用CSS变量实现炫酷惊人的悬浮效果
2019/04/26 HTML / CSS
浅谈html5与APP混合开发遇到的问题总结
2018/03/20 HTML / CSS
意大利在线药房:Saninforma
2021/02/11 全球购物
基层党员公开承诺书
2014/05/29 职场文书
护理学专业求职信
2014/06/29 职场文书
个人学习群众路线心得体会
2014/11/05 职场文书
525心理健康活动总结
2015/05/08 职场文书
护士年终工作总结不会写?各科护士模板总结
2020/01/02 职场文书
【海涛DOTA解说】EVE女子战队独家录像加ZSMJ神牛两连发
2022/04/01 DOTA
Linux中文件的基本属性介绍
2022/06/01 Servers