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下进行UDP网络编程的教程
Apr 29 Python
Python实现批量将word转html并将html内容发布至网站的方法
Jul 14 Python
Python实现破解猜数游戏算法示例
Sep 25 Python
python命令行解析之parse_known_args()函数和parse_args()使用区别介绍
Jan 24 Python
python实现爬山算法的思路详解
Apr 09 Python
使用python实现回文数的四种方法小结
Nov 24 Python
在python中做正态性检验示例
Dec 09 Python
django数据模型on_delete, db_constraint的使用详解
Dec 24 Python
简单了解python字符串前面加r,u的含义
Dec 26 Python
Python3使用腾讯云文字识别(腾讯OCR)提取图片中的文字内容实例详解
Feb 18 Python
Python Socketserver实现FTP文件上传下载代码实例
Mar 27 Python
Python filter()及reduce()函数使用方法解析
Sep 05 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 安全过滤函数代码
2011/05/07 PHP
PHP用mb_string函数库处理与windows相关中文字符及Win环境下开启PHP Mb_String方法
2015/11/11 PHP
php如何比较两个浮点数是否相等详解
2019/02/12 PHP
PHP+RabbitMQ实现消息队列的完整代码
2019/03/20 PHP
jQuery学习5 jQuery事件模型
2010/02/07 Javascript
Javascript实现的常用算法(如冒泡、快速、鸽巢、奇偶等)
2014/04/29 Javascript
JavaScript控制网页层收起和展开效果的方法
2015/04/15 Javascript
JS函数的定义与调用方法推荐
2016/05/12 Javascript
全面理解JavaScript中的闭包
2016/05/12 Javascript
jQuery实现的选择商品飞入文本框动画效果完整实例
2016/08/10 Javascript
js date 格式化
2017/02/15 Javascript
微信小程序 图片上传实例详解
2017/05/05 Javascript
JavaScript正则表达式和级联效果
2017/09/14 Javascript
使用vs code开发Nodejs程序的使用方法
2017/09/21 NodeJs
jQuery Ajax实现Select多级关联动态绑定数据的实例代码
2018/10/26 jQuery
vue + node如何通过一个Txt文件批量生成MP3并压缩成Zip
2020/06/02 Javascript
echarts实现获取datazoom的起始值(包括x轴和y轴)
2020/07/20 Javascript
Python学习小技巧总结
2018/06/10 Python
python函数局部变量、全局变量、递归知识点总结
2019/11/15 Python
Django 项目通过加载不同env文件来区分不同环境
2020/02/17 Python
使用python执行shell脚本 并动态传参 及subprocess的使用详解
2020/03/06 Python
Python基于Twilio及腾讯云实现国际国内短信接口
2020/06/18 Python
Python faker生成器生成虚拟数据代码实例
2020/07/20 Python
Hotels.com香港酒店网:你的自由行酒店订房专家
2018/01/22 全球购物
公司员工检讨书
2014/02/08 职场文书
2014年教研活动总结范文
2014/04/26 职场文书
承诺书格式范文
2014/06/03 职场文书
人力资源管理专业自荐信
2014/06/24 职场文书
中秋节国旗下演讲稿
2014/09/05 职场文书
个人对照检查材料思想汇报(四风问题)
2014/09/25 职场文书
综治工作汇报材料
2014/10/27 职场文书
公务员政审个人总结
2015/02/12 职场文书
2015新学期开学寄语
2015/02/26 职场文书
城管年度个人总结
2015/02/28 职场文书
2016思想纪律作风整顿心得体会
2016/01/23 职场文书
python 破解加密zip文件的密码
2021/04/22 Python