在处理训练样本的时候,有时你发现,虽然文件是jpg, jpeg结尾的,但是可能是被篡改过的,其实它有可能是png格式,假如这种图片很多,如何方便批处理呢?
两种方式:
(1) JPEG的文件布局如下:
JPEG SOI : FF D8 // 图片起始
JPEG APP0:0xFFE0 //
APP0 SIZE:1D 23 //当前标记的长度
JFIF Flag:JFIF // JFIF 标识
VERSION:// 版本号
ATTRIBUTION: // 长宽、DPI等信息
JPEG APP1: FF E1
APP1 Size : 1C 45 // 注意:前面这三个WORD都是big endian的
EXIF Flag : 'Exif', 0, 0
---------
TIFF : // TIFF格式的EXIF数据
---------
JPEG APPn: FF En // APPn 标记,可选
DQT :0xFFDB //Define Quantization Table,定义量化表
SOF0:0xFFC0 //Start of Frame,帧图像开始
DHT:0xFFC4 //Difine Huffman Table,定义哈夫曼表
SOS:0xFFDA // Start of Scan,扫描开始 12字节
压缩数据
JPEG EOI : FF D9 // 图片结束
JPEG图片的标记
每一个JPEG文件的内容都开始于一个二进制的值 '0xFFD8', 并结束于二进制值'0xFFD9'。
所以,判断函数如下(is_jpg):
import os
import sys
import cv2
from PIL import Image
def is_jpg(filename):
data = open(filename, "rb").read(11)
if data[:2] != '\xff\xd8':
return False
if data[-2:] != '\0xff\0xd9':
return False
return True
def is_jpg_pil(filename):
try:
img = Image.open(filename)
return img.format == "JPEG"
except:
return False
(2)通过PIL Image直接判断:
如:上面的is_jpg_pil函数
参考博客:https://blog.csdn.net/shelldon/article/details/54144406(JPEG详细介绍)