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文件中文编码问题
Nov 22 Python
django用户注册、登录、注销和用户扩展的示例
Mar 19 Python
Django实现分页功能
Jul 02 Python
在python中以相同顺序shuffle两个list的方法
Dec 13 Python
python3实现zabbix告警推送钉钉的示例
Feb 20 Python
利用Python半自动化生成Nessus报告的方法
Mar 19 Python
python使用Plotly绘图工具绘制气泡图
Apr 01 Python
基于python实现百度翻译功能
May 09 Python
Django框架模板文件使用及模板文件加载顺序分析
May 23 Python
序列化Python对象的方法
Aug 01 Python
python打包多类型文件的操作方法
Sep 21 Python
Python 微信公众号文章爬取的示例代码
Nov 30 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修改数组键名的方法示例
2017/04/15 PHP
为Plesk PHP7启用Oracle OCI8扩展方法总结
2019/03/29 PHP
零基础php编程好学吗
2019/10/11 PHP
Nigma vs Alliance BO5 第四场2.14
2021/03/10 DOTA
jquery 常用操作方法
2010/01/28 Javascript
javaScript 页面自动加载事件详解
2014/02/10 Javascript
Javascript 绘制 sin 曲线过程附图
2014/08/21 Javascript
用JavaScript来美化HTML的select标签的下拉列表效果
2015/11/17 Javascript
详解js实现线段交点的三种算法
2016/08/09 Javascript
JavaScript 数据类型详解
2017/03/13 Javascript
Vue 单文件中的数据传递示例
2017/03/21 Javascript
jQuery修改DOM结构_动力节点Java学院整理
2017/07/05 jQuery
原生JS实现自定义滚动条效果
2020/10/27 Javascript
EasyUI在Panel上动态添加LinkButton按钮
2017/08/11 Javascript
vue this.reload 方法 配置
2018/09/12 Javascript
Vue2.x中利用@font-size引入字体图标报错的解决方法
2018/09/28 Javascript
JavaScript错误处理操作实例详解
2019/01/04 Javascript
详解关于html,css,js三者的加载顺序问题
2019/04/10 Javascript
JS中async/await实现异步调用的方法
2019/08/28 Javascript
Python获取央视节目单的实现代码
2015/07/25 Python
Python简单实现两个任意字符串乘积的方法示例
2018/04/12 Python
详解Python列表赋值复制深拷贝及5种浅拷贝
2019/05/15 Python
Django框架自定义模型管理器与元选项用法分析
2019/07/22 Python
在python中创建指定大小的多维数组方式
2019/11/28 Python
HTML5中的websocket实现直播功能
2018/05/21 HTML / CSS
美国现代家具购物网站:LexMod
2019/01/09 全球购物
能否解释一下XSS cookie盗窃是什么意思
2012/06/02 面试题
见习期自我鉴定
2014/01/31 职场文书
护士自我鉴定怎么写
2014/02/07 职场文书
煤矿安全生产责任书
2014/04/15 职场文书
设备收款委托书范本
2014/10/02 职场文书
投资意向协议书
2015/01/29 职场文书
2015年感恩节演讲稿(优选篇)
2015/03/20 职场文书
读《瓦尔登湖》有感:每个人都需要一个瓦尔登湖
2019/10/17 职场文书
基于python的matplotlib制作双Y轴图
2021/04/20 Python