可交换图像文件格式(英语:Exchangeable image file format,官方简称Exif),是专门为数码相机的照片设定的文件格式,可以记录数码照片的属性信息和拍摄数据。EXIF可以附加于JPEG、TIFF、RIFF等文件之中,为其增加有关数码相机拍摄信息的内容和索引图或图像处理软件的版本信息[1]。
xif标准最初由日本电子工业发展协会(JEIDA - Japan Electronic Industry Development Association)制订,目前的最新版本是发布于2010年04月的 Exif 2.3 版,该版本曾在2012年12月以及2013年5月有所修正 ,并已经应用到各个厂商的新影像设备中。2
Exif 文件实际是JPEG文件的一种,遵从JPEG标准,只是在文件头信息中增加了有关拍摄信息的内容和索引图。所以你可以使用任何支持JPEG格式的图像工具软件观看 Exif 文件,但图像一旦被修改,Exif 信息可能会永久丢失,故编辑 Exif 必须使用专门的软件。所有的JPEG图像以字符串“0xFFD8”开头,并以字符串“0xFFD9”结束。0xFFE0 – 0xFFEF之间的标识符称为“应用标记”,没有被常规JPEG文件利用,Exif正是利用这些信息串记录拍摄信息如快门速度、光圈值等,甚至可以包括全球定位信息。3
标签号 | Exif 定义名 | 中文定义名 | 备注 |
---|---|---|---|
0x010E | ImageDescription | 图像描述 | |
0x013B | Artist | 作者 | |
0x010F | Make | 生产商 | |
0x0110 | Model | 型号 | 相机型号 |
0x0112 | Orientation | 方向 | |
0x011A | XResolution | 水平方向分辨率 | |
0x011B | YResolution | 垂直方向分辨率 | |
0x0128 | ResolutionUnit | 分辨率单位 | |
0x0131 | Software | 软件 | 固件Firmware版本或者编辑软件 |
0x0132 | DateTime | 日期和时间 | 照片最后修改时间 |
0x0213 | YCbCrPositioning | YCbCr定位 | |
0x8769 | ExifOffset | Exif子IFD偏移量 | |
0x829A | ExposureTime | 曝光时间 | 快门速度 |
0x829D | FNumber | 光圈系数 | 光圈的F值 |
0x8822 | ExposureProgram | 曝光程序 | 自动曝光、光圈优先、快门优先、M档等 |
0x8827 | ISOSpeedRatings | ISO感光度 | |
0x9000 | ExifVersion | Exif 版本 | |
0x9003 | DateTimeOriginal | 拍摄时间 | 照片拍摄时间 |
0x9004 | DateTimeDigitized | 数字化时间 | 照片被写入时间 |
0x9204 | ExposureBiasValue | 曝光补偿 | |
0x9205 | MaxApertureValue | 最大光圈 | |
0x9207 | MeteringMode | 测光模式 | 平均测光、中央重点测光、点测光 |
0x9208 | Lightsource | 光源 | 一般记录白平衡 |
0x9209 | Flash | 闪光灯 | 闪光灯状态 |
0x920A | FocalLength | 镜头焦距 | 镜头物理焦距 |
0x927C | MakerNote | 厂商注释 | |
0x9286 | UserComment | 用户注释 | |
0xA000 | FlashPixVersion | FlashPix版本 | |
ColorSpace | 色彩空间 | AdobeRGB、sRGB等 | |
ExifImageWidth | 图像宽度 | ||
0xA003 | ExifImageLength | 图像高度 | |
0xA433 | LensMake | 镜头生产商 | |
0xA434 | LensModel | 镜头型号 |
通过以上可知,Exif
信息是可以修改的,包含部分隐私数据,发送原图时很有可能会附带Exif
信息。
在使用手机或相机拍照时,有时候会横握设备有时候又竖握设备,手持方向发生变化,设备内部的重力感应器件会告诉设备,照片究竟哪个边是向上的。然而,实际图像的像素数据不会旋转,因为图像传感器是对连续的像素信息流进行逐行读取的,因此无论纵向和横向握持相机,图像都是按照一个方向进行存储,拍照设备和电脑之所以能够按照正确的方向显示图片,正是因为照片中保存的Exif信息。下图参考自4
图片阅读器之所以能够将横向排列的图像数据显示为正常图像,是因为根据Exif中的orientation参数对展示图像进行了处理,如果图片处理程序不处理Exif信息,那么图像将横向展示如下图:
一些图像处理程序不会去解析Exif信息,如NumPy、SciPy,TensorFlow,Keras等,当使用这些工具导入图像时,都将获得原始的未旋转图像数据,如横竖上下颠倒等,将如此数据输入视觉模型中时,会影响模型的分类检测分割效果。
在PIL库中,Exif的编码可通过如下方式获取
from PIL.ExifTags import TAGS
print(TAGS)
{
11: 'ProcessingSoftware',
254: 'NewSubfileType',
255: 'SubfileType',
256: 'ImageWidth',
257: 'ImageLength',
258: 'BitsPerSample',
259: 'Compression',
262: 'PhotometricInterpretation',
263: 'Thresholding',
264: 'CellWidth',
265: 'CellLength',
266: 'FillOrder',
269: 'DocumentName',
270: 'ImageDescription',
271: 'Make',
272: 'Model',
273: 'StripOffsets',
274: 'Orientation',
277: 'SamplesPerPixel',
278: 'RowsPerStrip',
279: 'StripByteCounts',
280: 'MinSampleValue',
281: 'MaxSampleValue',
282: 'XResolution',
283: 'YResolution',
284: 'PlanarConfiguration',
285: 'PageName',
288: 'FreeOffsets',
289: 'FreeByteCounts',
290: 'GrayResponseUnit',
291: 'GrayResponseCurve',
292: 'T4Options',
293: 'T6Options',
296: 'ResolutionUnit',
297: 'PageNumber',
301: 'TransferFunction',
305: 'Software',
306: 'DateTime',
315: 'Artist',
316: 'HostComputer',
317: 'Predictor',
318: 'WhitePoint',
319: 'PrimaryChromaticities',
320: 'ColorMap',
321: 'HalftoneHints',
322: 'TileWidth',
323: 'TileLength',
324: 'TileOffsets',
325: 'TileByteCounts',
330: 'SubIFDs',
332: 'InkSet',
333: 'InkNames',
334: 'NumberOfInks',
336: 'DotRange',
337: 'TargetPrinter',
338: 'ExtraSamples',
339: 'SampleFormat',
340: 'SMinSampleValue',
341: 'SMaxSampleValue',
342: 'TransferRange',
343: 'ClipPath',
344: 'XClipPathUnits',
345: 'YClipPathUnits',
346: 'Indexed',
347: 'JPEGTables',
351: 'OPIProxy',
512: 'JPEGProc',
513: 'JpegIFOffset',
514: 'JpegIFByteCount',
515: 'JpegRestartInterval',
517: 'JpegLosslessPredictors',
518: 'JpegPointTransforms',
519: 'JpegQTables',
520: 'JpegDCTables',
521: 'JpegACTables',
529: 'YCbCrCoefficients',
530: 'YCbCrSubSampling',
531: 'YCbCrPositioning',
532: 'ReferenceBlackWhite',
700: 'XMLPacket',
4096: 'RelatedImageFileFormat',
4097: 'RelatedImageWidth',
4098: 'RelatedImageLength',
18246: 'Rating',
18249: 'RatingPercent',
32781: 'ImageID',
33421: 'CFARepeatPatternDim',
33422: 'CFAPattern',
33423: 'BatteryLevel',
33432: 'Copyright',
33434: 'ExposureTime',
33437: 'FNumber',
33723: 'IPTCNAA',
34377: 'ImageResources',
34665: 'ExifOffset',
34675: 'InterColorProfile',
34850: 'ExposureProgram',
34852: 'SpectralSensitivity',
34853: 'GPSInfo',
34855: 'ISOSpeedRatings',
34856: 'OECF',
34857: 'Interlace',
34858: 'TimeZoneOffset',
34859: 'SelfTimerMode',
36864: 'ExifVersion',
36867: 'DateTimeOriginal',
36868: 'DateTimeDigitized',
37121: 'ComponentsConfiguration',
37122: 'CompressedBitsPerPixel',
37377: 'ShutterSpeedValue',
37378: 'ApertureValue',
37379: 'BrightnessValue',
37380: 'ExposureBiasValue',
37381: 'MaxApertureValue',
37382: 'SubjectDistance',
37383: 'MeteringMode',
37384: 'LightSource',
37385: 'Flash',
37386: 'FocalLength',
37387: 'FlashEnergy',
37388: 'SpatialFrequencyResponse',
37389: 'Noise',
37393: 'ImageNumber',
37394: 'SecurityClassification',
37395: 'ImageHistory',
37396: 'SubjectLocation',
37397: 'ExposureIndex',
37398: 'TIFF/EPStandardID',
37500: 'MakerNote',
37510: 'UserComment',
37520: 'SubsecTime',
37521: 'SubsecTimeOriginal',
37522: 'SubsecTimeDigitized',
37888: 'AmbientTemperature',
37889: 'Humidity',
37890: 'Pressure',
37891: 'WaterDepth',
37892: 'Acceleration',
37893: 'CameraElevationAngle',
40091: 'XPTitle',
40092: 'XPComment',
40093: 'XPAuthor',
40094: 'XPKeywords',
40095: 'XPSubject',
40960: 'FlashPixVersion',
40961: 'ColorSpace',
40962: 'ExifImageWidth',
40963: 'ExifImageHeight',
40964: 'RelatedSoundFile',
40965: 'ExifInteroperabilityOffset',
41483: 'FlashEnergy',
41484: 'SpatialFrequencyResponse',
41486: 'FocalPlaneXResolution',
41487: 'FocalPlaneYResolution',
41488: 'FocalPlaneResolutionUnit',
41492: 'SubjectLocation',
41493: 'ExposureIndex',
41495: 'SensingMethod',
41728: 'FileSource',
41729: 'SceneType',
41730: 'CFAPattern',
41985: 'CustomRendered',
41986: 'ExposureMode',
41987: 'WhiteBalance',
41988: 'DigitalZoomRatio',
41989: 'FocalLengthIn35mmFilm',
41990: 'SceneCaptureType',
41991: 'GainControl',
41992: 'Contrast',
41993: 'Saturation',
41994: 'Sharpness',
41995: 'DeviceSettingDescription',
41996: 'SubjectDistanceRange',
42016: 'ImageUniqueID',
42032: 'CameraOwnerName',
42033: 'BodySerialNumber',
42034: 'LensSpecification',
42035: 'LensMake',
42036: 'LensModel',
42037: 'LensSerialNumber',
42240: 'Gamma',
50341: 'PrintImageMatching',
50706: 'DNGVersion',
50707: 'DNGBackwardVersion',
50708: 'UniqueCameraModel',
50709: 'LocalizedCameraModel',
50710: 'CFAPlaneColor',
50711: 'CFALayout',
50712: 'LinearizationTable',
50713: 'BlackLevelRepeatDim',
50714: 'BlackLevel',
50715: 'BlackLevelDeltaH',
50716: 'BlackLevelDeltaV',
50717: 'WhiteLevel',
50718: 'DefaultScale',
50719: 'DefaultCropOrigin',
50720: 'DefaultCropSize',
50721: 'ColorMatrix1',
50722: 'ColorMatrix2',
50723: 'CameraCalibration1',
50724: 'CameraCalibration2',
50725: 'ReductionMatrix1',
50726: 'ReductionMatrix2',
50727: 'AnalogBalance',
50728: 'AsShotNeutral',
50729: 'AsShotWhiteXY',
50730: 'BaselineExposure',
50731: 'BaselineNoise',
50732: 'BaselineSharpness',
50733: 'BayerGreenSplit',
50734: 'LinearResponseLimit',
50735: 'CameraSerialNumber',
50736: 'LensInfo',
50737: 'ChromaBlurRadius',
50738: 'AntiAliasStrength',
50739: 'ShadowScale',
50740: 'DNGPrivateData',
50741: 'MakerNoteSafety',
50778: 'CalibrationIlluminant1',
50779: 'CalibrationIlluminant2',
50780: 'BestQualityScale',
50781: 'RawDataUniqueID',
50827: 'OriginalRawFileName',
50828: 'OriginalRawFileData',
50829: 'ActiveArea',
50830: 'MaskedAreas',
50831: 'AsShotICCProfile',
50832: 'AsShotPreProfileMatrix',
50833: 'CurrentICCProfile',
50834: 'CurrentPreProfileMatrix',
50879: 'ColorimetricReference',
50931: 'CameraCalibrationSignature',
50932: 'ProfileCalibrationSignature',
50934: 'AsShotProfileName',
50935: 'NoiseReductionApplied',
50936: 'ProfileName',
50937: 'ProfileHueSatMapDims',
50938: 'ProfileHueSatMapData1',
50939: 'ProfileHueSatMapData2',
50940: 'ProfileToneCurve',
50941: 'ProfileEmbedPolicy',
50942: 'ProfileCopyright',
50964: 'ForwardMatrix1',
50965: 'ForwardMatrix2',
50966: 'PreviewApplicationName',
50967: 'PreviewApplicationVersion',
50968: 'PreviewSettingsName',
50969: 'PreviewSettingsDigest',
50970: 'PreviewColorSpace',
50971: 'PreviewDateTime',
50972: 'RawImageDigest',
50973: 'OriginalRawFileDigest',
50974: 'SubTileBlockSize',
50975: 'RowInterleaveFactor',
50981: 'ProfileLookTableDims',
50982: 'ProfileLookTableData',
51008: 'OpcodeList1',
51009: 'OpcodeList2',
51022: 'OpcodeList3',
51041: 'NoiseProfile'
}
使用PIL库时,一幅图像数据Exif信息的获取可通过getexif方法获得。
from PIL import Image
img = Image.open("./m.jpg")
print(img.getexif())
{
34665: 290,
36864: b '0210',
37121: b '\x01\x02\x03\x00',
37377: 29.8973,
36867: '2020:09:02 23:02:43',
36868: '2020:09:02 23:02:43',
37378: 2.52,
37379: 0.0,
37380: 0.0,
37383: 5,
37384: 1,
37385: 24,
37386: 3.38,
40961: 1,
40962: 2448,
40965: 8434,
41990: 0,
37520: '438870',
37521: '438870',
37522: '438870',
40963: 3264,
41996: 0,
41495: 2,
41728: b '\x03',
33434: 0.04,
33437: 2.4,
41729: b '\x01',
34850: 2,
41985: 1,
34855: 250,
41986: 0,
40960: b '0100',
41987: 0,
41988: 1.0,
41989: 26,
41991: 0,
41992: 0,
41993: 0,
41994: 0,
37500: b 'Auto\x00',
296: 2,
282: 72.0,
256: 2448,
257: 3264,
258: (8, 8, 8),
34853: {
0: b '\x02\x02\x00\x00',
1: 'N',
2: (22.0, 38.0, 54.697723),
3: 'E',
4: (114.0, 3.0, 35.029907),
5: b '\x01',
6: 0.0,
7: (15.0, 2.0, 42.0),
27: 'CELLID',
29: '2020:09:02'
},
41995: b 'ipp\x00',
270: 'bty',
271: 'HUAWEI',
272: 'KNT-UL10',
305: 'KNT-UL10 8.0.0.556(C00)',
274: 0,
306: '2020:09:02 23:02:43',
531: 1,
283: 72.0
}
譬如274表示orientation。其处理可参考5。
参考:
1.https://zh.wikipedia.org/wiki/Exif
2.https://zhuanlan.zhihu.com/p/366726838
3.https://baike.baidu.com/item/EXIF%E4%BF%A1%E6%81%AF/3297493
4.https://mp.weixin.qq.com/s?__biz=MzAxNTc4MTc1Ng==&mid=2649395978&idx=2&sn=9d19517b41e30069787c6998924fb850&chksm=83e0e919b497600fb7a630b0474f9b4a25866f997b6c4eca359c70cee8a6bf9aeead22a4f589&mpshare=1&scene=1&srcid=1008W3nbLinwcMZgf49emKar&sharer_sharetime=1633664055894&sharer_shareid=715337ab6f6483872d17f37de2f7e4bf¬replace=true&exportkey=A0i5QEYtCX3RYqAQLZ%2B%2FfNg%3D&pass_ticket=evQ%2BD4tN43xMZl5Nol%2BrBPpJxKHbPr9OuEQIL6mbg3eRRC%2F%2BbEwUDklPhQa8gB4M&wx_header=0#rd
5.https://github.com/ageitgey/image_to_numpy