一、什么是EXIF?

EXIF信息,是可交换图像文件的缩写,是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。EXIF最初由日本电子工业发展协会在1996年制定,版本为1.0。1998年,升级到2.1,增加了对音频文件的支持。2002年3月,发表了2.2版。EXIF可以附加于JPEG、TIFF、RIFF等文件之中,为其增加有关数码相机拍摄信息的内容和索引图或图像处理软件的版本信息。

二、标识

所有的JPEG文件以字符串“0xFFD8”开头,并以字符串“0xFFD9”结束。文件头中有一系列“0xFF??”格式的字符串,称为“标识”,用来标记JPEG文件的信息段。其中,0xFFE0 -- 0xFFEF之间的标识符称为“应用标记”,没有被常规JPEG文件利用,Exif正是利用这些信息串记录拍摄信息如快门速度、光圈值等,甚至可以包括全球定位信息。按照Exif2.1标准对这些标识符的定义,数码相机可以把各种拍摄信息记入数码图像中,应用软件可以读取这些数据,再按照Exif2.1标准,检索出它们的具体含义,一般而言包括以下一些信息:

Image Description # 图像描述、来源,指生成图像的工具

Artist # 作者,有些相机可以输入使用者的名字

Make # 生产者,指产品生产厂家

Model # 型号,指设备型号

Orientation # 方向,有的相机支持,有的不支持

XResolution/YResolution # X/Y方向分辨率

Resolution Unit # 分辨率单位,一般为PPI

Software # 软件,显示固件Firmware版本

Date Time # 日期和时间

YCbCrPositioning # 色相定位

Exif Offset Exif # 信息位置,定义Exif在信息在文件中的写入,有些软件不显示

Exposure Time # 曝光时间,即快门速度

F Number # 光圈系数

Exposure Program # 曝光程序,指程序式自动曝光的设置,各相机不同,可能是Shutter Priority(快门优先,Tv)、Aperture Priority(光圈优先,Av)等等。

ISO speed ratings # 感光度

Exif Version Exif # 版本

DateTime Original # 创建时间

DateTime Digitized # 数字化时间

Components Configuration # 图像构造(多指色彩组合方案)

Compressed Bits per Pixel(BPP) # 压缩时每像素色彩位,指压缩程度

Exposure Bias Value # 曝光补偿

Max Aperture Value # 最大光圈

Metering Mode # 测光方式、平均式测光、中央重点测光、点测光等。

Light source # 光源,指白平衡设置

Flash # 是否使用闪光灯

Focal Length # 焦距,一般显示镜头物理焦距,有些软件可以定义一个系数,从而显示相当于35mm相机的焦距

Maker Note (User Comment) # 作者标记、说明、记录

Flash Pix Version Flash Pix # 版本(个别机型支持)

Color Space # 色域、色彩空间

ExifImage Width (Pixel X Dimension) # 图像宽度,指横向像素数

ExifImage Length (Pixel Y Dimension) # 图像高度,指纵向像素数

Interoperability IFD # 通用性扩展项定义指针和TIFF文件相关,具体含义不详

File Source # 源文件

Compression # 压缩比

等等

三、如何获取图片的EXIF信息

通过PIL库即可实现这个功能:

import pprint

from PIL import Image

from PIL.ExifTags import TAGS

# 从图像中获取内置的EXIF数据

def get_exif_data(fname):

ret = {}

try:

img = Image.open(fname)

if hasattr(img, '_getexif'):

exifinfo = img._getexif()

if exifinfo != None:

for tag, value in exifinfo.items():

decode = TAGS.get(tag, tag)

ret[decode] = value

except IOError:

print('IOError' + fname)

return ret

if __name__ == '__main__':

file = '/home/dulingwen/Downloads/test_image/134592100021557899975799.jpg'

exif = get_exif_data(file)

pprint.pprint(exif)

打印出的内容如下:

{'ApertureValue': (169, 100),

'BrightnessValue': (451, 100),

'ColorSpace': 1,

'ComponentsConfiguration': '???',

'Compression': 6,

'DateTime': '2019:05:15 13:59:35',

'DateTimeDigitized': '2019:05:15 13:59:35',

'DateTimeOriginal': '2019:05:15 13:59:35',

'ExifImageHeight': 1940,

'ExifImageWidth': 2592,

'ExifInteroperabilityOffset': 719,

'ExifOffset': 206,

'ExifVersion': '0220',

'ExposureBiasValue': (0, 6),

'ExposureMode': 0,

'ExposureProgram': 2,

'ExposureTime': (14, 10000),

'FNumber': (18000, 10000),

'Flash': 16,

'FlashPixVersion': '0100',

'FocalLength': (4216, 1000),

'FocalLengthIn35mmFilm': 21,

'ISOSpeedRatings': 100,

'ImageLength': 1080,

'ImageWidth': 1920,

'LightSource': 0,

'Make': 'Xiaomi',

'MaxApertureValue': (169, 100),

'MeteringMode': 1,

'Model': 'MI 8',

'Orientation': 1,

'ResolutionUnit': 2,

'SceneCaptureType': 0,

'SceneType': '?',

'SensingMethod': 1,

'ShutterSpeedValue': (9419, 1000),

'SubsecTime': '782963',

'SubsecTimeDigitized': '782963',

'SubsecTimeOriginal': '782963',

'WhiteBalance': 0,

'XResolution': (72, 1),

'YCbCrPositioning': 1,

'YResolution': (72, 1)}