Python校验JPEG图片完整性的三种方法
本文介绍利用Python判断JPEG图片完整性的三种方法。首先解析固定文件头(JFIF/Exif)快速识别格式;其次使用PIL库的Image.open尝试解码;最后通过验证文件结束标记\xff\xd9及调用verify()方法检测文件是否损坏。适用于批量检查文件夹中图片是否下载完整或存在截断问题。
基于文件头的JPEG格式快速判断
仅依靠文件扩展名来判断文件格式并不可靠,因为扩展名可以被随意修改。JPEG文件具有固定的文件头结构,其标准格式包含特定的起始标记和标识符,具体结构如下所示:
Start Marker | JFIF Marker | Header Length | Identifier
0xff, 0xd8 | 0xff, 0xe0 | 2-bytes | "JFIF\0"
因此,可以通过读取文件头数据来快速判断文件是否为JPEG格式。核心逻辑是检查前几个字节是否符合JPEG的标准标记:
使用PIL库进行格式识别
def is_jpg(filename):
data = open(filename,'rb').read(11)
if data[:4] != '\xff\xd8\xff\xe0' and data[:4]!='\xff\xd8\xff\xe1':
return False
if data[6:] != 'JFIF\0' and data[6:] != 'Exif\0':
return False
return True
除了手动检查文件头,还可以借助Python的PIL(Pillow)类库来进行更稳健的判断。PIL库能够自动识别图片格式:
from PIL import Image
def is_jpg(filename):
try:
i=Image.open(filename)
return i.format =='JPEG'
except IOError:
return Fals
实际应用场景中,常需判断指定文件夹(如image文件夹)内的所有JPEG文件是否完整,即是否存在下载中断或文件损坏。以下是完整的实现代码:
完整代码实现与文件有效性校验
#coding=utf-8
#summary: 判断图片的有效性
import io
import os
from PIL import Image
#判断文件是否为有效(完整)的图片
#输入参数为文件路径
#会出现漏检的情况
def IsValidImage(pathfile):
bValid = True
try:
Image.open(pathfile).verify()
except:
bValid = False
return bValid
def is_valid_jpg(jpg_file):
"""判断JPG文件下载是否完整
"""
if jpg_file.split('.')[-1].lower() == 'jpg':
with open(jpg_file, 'rb') as f:
f.seek(-2, 2)
return f.read() == '\xff\xd9' #判定jpg是否包含结束字段
else:
return True
#利用PIL库进行jpeg格式判定,但有些没有结束字段的文件检测不出来
def is_jpg(filename):
try:
i=Image.open(filename)
return i.format =='JPEG'
except IOError:
return False
allfiles=os.listdir('image')
log_file=open('img_lossinfo.txt','w')
log = open('img_r.txt','w')
log_w=open('img_w.txt','w')
log1=open('img_jpeg.txt','w')
log2=open('img_notjpg.txt','w')
for i in allfiles:
#if 1:
if i[-4:]=='.jpg':
f=os.path.join('image',i)
value=IsValidImage(f)
if not value:
log_file.write(i+'\n')
if is_valid_jpg(f):
print f
log.write(i+'\n')
else:
log_w.write(i+'\n')
if is_jpg(f):
log1.write(i+'\n')
else:
log2.write(i+'\n')
上述内容即为使用Python判断JPEG图片完整性的完整示例,希望能为处理图片文件完整性校验提供参考。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









