python 判断图片是否损坏_检查图片是否损坏、图片后缀是否与实际图片类型对应 - Python...

图片工具

检查图片是否损坏

日常工作中,时常会需要用到图片,有时候图片在下载、解压过程中会损坏,而如果一张一张点击来检查就太不Cool了,因此我想大家都需要一个检查脚本;

测试图片,0.jpg是正常的,broke.jpg是手动删掉一点内容后异常的:

脚本运行结果:

代码如下:# 从本地判断图片是否损坏

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的情况,这就导致这些图片无法直接展示,且需要手动改回实际类型,因此有了下面这个脚本;

类型校验转换前:

校验log:

校验及转换结果:

代码如下: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打开后删掉一段即可来试试看哈;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428212.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20.链式队列

运行截图: 完整代码: 1 #include <stdio.h>2 #include <stdlib.h>3 4 #define datatype int5 6 typedef struct queue7 {8 datatype data;9 struct queue *pNext; 10 }Queue,*PQueue; 11 12 //入队 从尾部入,从头部出 13 PQueue enq(PQueue phead, dataty…

1到n阶乘算法的改进

1到n阶乘算法的改进 之前用到过好几次了&#xff0c;但总是很长时间不用就会忘了&#xff0c;所以这次直接把它扔进来了。 之前总是喜欢用双层循环&#xff0c;其实一个单层循环足以&#xff0c;下面将用Python和C两种语言进行展示 C&#xff1a; #include<iostream> …

lua 调用文件中的函数调用_深入Lua:调用相关的指令

前言这一节我们来深入解析与调用相关的指令&#xff0c;这些指令是&#xff1a;OP_CALL 调用OP_TAILCALL 尾调用OP_VARARG 可变参数OP_RETURN 返回解析这些指令的过程中&#xff0c;最重要的是时刻跟踪栈的变化情况。简单调用OP_CALL 的语法是&#xff1a;R(A), ... ,R(AC-2) :…

算法基础——列表查找

whats the 算法 算法&#xff08;Algorithm&#xff09;是指解题方案的准确而完整的描述&#xff0c;是一系列解决问题的清晰指令&#xff0c;算法代表着用系统的方法描述解决问题的策略机制。也就是说&#xff0c;能够对一定规范的输入&#xff0c;在有限时间内获得所要求的输…

Python画板画图之美

Python画板画图之美 *turtle.done() #可让画板窗口停止*1.绘制同切圆 pensize为画笔宽度 circle(n),n为半径大小&#xff0c;两者单位均为像素 import turtle turtle.pensize(2) #画笔宽度&#xff0c;单位为像素 turtle.circle(10) #圆半径&…

python request库_【Python爬虫】Request库入门

什么是爬虫&#xff1f; 网络爬虫&#xff08;又被称为网页蜘蛛&#xff0c;网络机器人&#xff0c;在FOAF社区中间&#xff0c;更经常的称为网页追逐者&#xff09;&#xff0c;是一种按照一定的规则&#xff0c;自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还…

Maven项目下update maven后Eclipse报错:java.lang.ClassNotFoundException: ContextLoaderL

严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListenerat org.apache.catalina.loader.WebappClassLoader.loadClass(Web…

python 隐藏命令行窗口_python如何只执行cmd中的动作,但消除或隐藏cmd窗口 - 小众知识...

【问题】 这里提到的&#xff0c;打包python中&#xff0c;由于python中调用windows的cmd去执行一些动作&#xff0c;所以打包后的python&#xff0c;结果还是会遇到&#xff0c;调用cmd窗口&#xff08;执行了对应的命令后&#xff09;一闪而过。 想要消除此cmd一闪而过的问题…

world文档粘贴图片进去看不到

在大学做实验报告的时候经常要插入一些截图&#xff0c;往往会遇到直接复制粘贴图片会看不到的情况&#xff0c;会很烦&#xff0c;我自己也找了好多方法&#xff0c;下面是我最喜欢的简便方法的一种。 解决方法如下: 可以点击鼠标右键选择段落&#xff0c;将行距修改为1.5倍即…

Ajax 调用webservice 解决跨域请求和发布到服务器后本地调用成功外网失败的问题...

webservice 代码 1 /// <summary>2 /// MESService 的摘要说明3 /// </summary>4 [WebService(Namespace "http://tempuri.org/")]5 [WebServiceBinding(ConformsTo WsiProfiles.BasicProfile1_1)]6 //[System.ComponentModel…

c盘users的用户名怎么改_怎么修改iPhone备份文件夹路径 iPhone C盘路径修改教程【详解】...

iPhone备份文件夹路径怎么修改_iPhone C盘备份路径修改教程 我们都知道iPhone默认的备份是在C盘&#xff0c;不过现在各种视频、照片体积那么大&#xff0c;小小的C盘只怕是负荷不了了&#xff0c;那么有什么办法去修改备份路径呢&#xff0c;下面小编就为大家介绍一下。需要注…

javaweb开发的准备工作——配置篇

1.配置 a. jdk配置&#xff08;用于web开发编程&#xff0c;此处不需要配置path&#xff0c;只需配置环境变量即可&#xff09; b. tomcat配置 打开Tomcat&#xff08;打开bin目录下的startup.bat文件&#xff09; 检验是否打开成功(两个网址都可以&#xff0c;出现汤姆猫即为…

阅读引擎开源项目调研总结

农历腊月初二&#xff0c;也是冬至后的第四个九天&#xff0c;俗称“四九”。冬至这一天开始数九&#xff0c;这就是人们所说的“提冬数九”。数上9天是一九&#xff0c;再数9天是二九……数到“九九”就算“九”尽了&#xff0c;“九尽杨花开”&#xff0c;那时天就暖了。《九…

ftp 上传文件夹_命令行连接FTP服务器

Windows下&#xff1a;打开命令行窗口&#xff0c;输入 ftp&#xff0c;进入ftp命令模式&#xff1a;输入 open ip地址 端口&#xff0c;进入ftp服务器&#xff0c;如open 172.16.3.77 2121。如下图&#xff1a;输入Windows下的用户名&#xff0c;然后输入密码&#xff08;注意…

创建实现一个简单的web项目

创建一个新的web项目 注意要选择Dynamic Web Project&#xff0c;第一次用可能要找一下&#xff0c;也可以直接搜索栏搜web&#xff0c;就会出来 图片是我自己照片照的&#xff0c;不好截图&#xff0c;看到有个人影勿慌哈哈哈哈&#xff0c;不是你眼睛的问题。 然后在web文件目…

一起学Python:列表介绍

列表介绍 想一想&#xff1a; 前面学习的字符串可以用来存储一串信息&#xff0c;那么想一想&#xff0c;怎样存储咱们班所有同学的名字呢&#xff1f;定义100个变量&#xff0c;每个变量存放一个学生的姓名可行吗&#xff1f;有更好的办法吗&#xff1f;答&#xff1a; 列表&l…

eclipse xml文件报错_Maven教程6: Maven与Eclipse整合

点击上方“Java技术前线”&#xff0c;选择“置顶或者星标”与你一起成长一、安装Maven插件下载下来的maven插件如下图所示&#xff1a;&#xff0c;插件存放的路径是&#xff1a;E:/MavenProject/Maven2EclipsePlugin进入到eclipse中的dropins目录下&#xff0c;新建三个txt文…

C语言#define宏定义可能注意不到的地方

#define使用的核心:直接替换 我也觉得自己很清楚这一点&#xff0c;但看到这一道输出程序片段结果题&#xff0c;还是懵了。大家也可以在不看我下方答案的情况下&#xff0c;自己做一下&#xff0c;题目如下: #include<stdio.h> #define P 3 #define S(a) P*a*a int mai…

结合JSP与HTML做一个九九乘法表

不说了&#xff0c;先上效果图&#xff0c;下面附有源码: 代码一:jsp表达式法 <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitio…

python中parse是什么_Python中optparse模块使用浅析

最近遇到一个问题&#xff0c;是指定参数来运行某个特定的进程&#xff0c;这很类似Linux中一些命令的参数了&#xff0c;比如ls -a&#xff0c;为什么加上-a选项会响应。optparse模块实现的也是类似的功能&#xff0c;它是为脚本传递命令参数。 使用此模块前&#xff0c;首先需…