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 相关文章推荐
用smtplib和email封装python发送邮件模块类分享
Feb 17 Python
Python最基本的数据类型以及对元组的介绍
Apr 14 Python
Python抽象类的新写法
Jun 18 Python
python获得文件创建时间和修改时间的方法
Jun 30 Python
开源软件包和环境管理系统Anaconda的安装使用
Sep 04 Python
python 使用re.search()筛选后 选取部分结果的方法
Nov 28 Python
python爬虫获取小区经纬度以及结构化地址
Dec 30 Python
Python socket实现多对多全双工通信的方法
Feb 13 Python
python 字符串追加实例
Jul 20 Python
np.random.seed() 的使用详解
Jan 14 Python
python获取本周、上周、本月、上月及本季的时间代码实例
Sep 08 Python
requests在python中发送请求的实例讲解
Feb 17 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
基于preg_match_all采集后数据处理的一点心得笔记(编码转换和正则匹配)
2014/01/31 PHP
Linux中为php配置伪静态
2014/12/17 PHP
symfony表单与页面实现技巧
2015/01/26 PHP
php上传功能集后缀名判断和随机命名(强力推荐)
2015/09/10 PHP
laravel获取不到session的三种解决办法【推荐】
2018/09/16 PHP
扩展javascript的Date方法实现代码(prototype)
2010/11/20 Javascript
window.open打开页面居中显示的示例代码
2013/12/27 Javascript
js 模式窗口(模式对话框和非模式对话框)的使用介绍
2014/07/17 Javascript
JQuery实现鼠标滚轮滑动到页面节点
2015/07/28 Javascript
深入理解逻辑表达式的用法 与或非的用法
2016/06/06 Javascript
angularJs中ng-model-options设置数据同步的方法
2018/09/30 Javascript
详解基于vue-cli3快速发布一个fullpage组件
2019/03/08 Javascript
Vue实现微信支付功能遇到的坑
2019/06/05 Javascript
JavaScript遍历数组和对象的元素简单操作示例
2019/07/09 Javascript
浅谈Three.js截图并下载的大坑
2019/11/01 Javascript
原生javascript制作的拼图游戏实现方法详解
2020/02/23 Javascript
解决vue中使用less/sass及使用中遇到无效的问题
2020/10/24 Javascript
使用vue编写h5公众号跳转小程序的实现代码
2020/11/27 Vue.js
[42:32]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第二场 10.28
2020/10/28 DOTA
[47:03]完美世界DOTA2联赛PWL S3 access vs LBZS 第一场 12.20
2020/12/23 DOTA
python 接口测试response返回数据对比的方法
2018/02/11 Python
wxPython实现列表增删改查功能
2019/11/19 Python
python3 assert 断言的使用详解 (区别于python2)
2019/11/27 Python
浅谈pytorch中torch.max和F.softmax函数的维度解释
2020/06/28 Python
Python3+PyCharm+Django+Django REST framework配置与简单开发教程
2021/02/16 Python
SQL Server的固定数据库角色都有哪些?对应的服务器权限有哪些?
2013/05/18 面试题
如何拷贝一整个Java对象,包括它的状态
2013/12/27 面试题
小学生红领巾广播稿
2014/01/21 职场文书
决定成败的关键——创业计划书
2014/01/24 职场文书
高一学生评语大全
2014/04/25 职场文书
奥巴马胜选演讲稿
2014/05/15 职场文书
师德先进个人事迹材料
2014/12/19 职场文书
北京英文导游词
2015/02/12 职场文书
JS 4个超级实用的小技巧 提升开发效率
2021/10/05 Javascript
关于 Python json中load和loads区别
2021/11/07 Python
vue-cli3.0修改打包后的文件名和文件地址,打包后本地运行报错解决
2022/04/06 Vue.js