JPEG/Exif/TIFF格式解读(2):图片元数据保存及EXIF详解
Author:zhoulujun Date:
图片元数据(Metadata)
元数据(Metadata),又称中介数据、中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息。用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。
图片元数据(Metadata) 是嵌入到图片文件中的一些标签。比较像文件属性,但是种类繁多。对于数码图像,目前常见的研数据有EXIF, IPTC和XMP三种:
EXIF:通常被数码相机在拍摄照片时自动添加,比如相机型号、镜头、曝光、图片尺寸等信息
IPTF:比如图片标题、关键字、说明、作者、版权等信息。主要是由人工在后期通过软件写入的数据。
XMP:XMP实际上是一种元数据存储和管理的标准,可以将Exif,IPTC或其他的数据都按XMP统一的格式存放在图像文件中。
但是当將JPG转换为其它格式如png, pdf等时,由于这些格式都不支持Exif格式,所以Exif信息就会丢失。为了解决这个问题,Adobe公司推出用XMP管理元数据的方法,即将图像中的元数据如Exif,IPTC等都纳入XMP库中,由XMP管理。
元数据的嵌入方式因图像格式而异,不同格式的图像文件有不同的嵌入方式。
如JPG、TIF就是EXIF,而PNG
在windows上,图片元数据查看就是就是图片文件的 【属性】——>【详细信息】 这一页,如下图所示:
Exif 是什么?
Exif为Exchangeable Image File(可交换图像文件)的缩写,是专门为数码相机的照片设定的,就是用来记录拍摄图像时的各种信息:图像信息(厂商,分辨率等),相机拍摄记录(ISO,白平衡,饱和度,锐度等),缩略图(缩略图宽度,高度等),gps(拍摄时的经度,纬度,高度)等,将这些信息按照JPEG文件标准放在图像文件头部。
Exif所记录主要的几类信息:
拍摄信息
拍摄器材(机身、镜头、闪光灯等)
拍摄参数(快门速度、光圈F值、ISO速度、焦距、测光模式等)
图像处理参数(锐化、对比度、饱和度、白平衡等)
图像描述及版权信息
GPS定位数据
缩略图
Exif最初由日本电子工业发展协会(JEIDA --Japan Electronic Industry Development Association) 在1996年制定(1.0),1998年省级到了2.1版本,增加对了音频文件的支持。目前的最新版本是2.21 版。国际标准化组织(ISO)正在制订的相机文件设计标准(DCF -- Design role for Camera File system/相机文件系统设计规则)可能以Exif2.1为基础。
目前几乎新型的数码相机都使用Exif文件格式来存储图像.
关于EXIF与JPEG的关系
Exif 文件实际是JPEG文件的一种,遵从JPEG标准,因此加入 EXIF 信息并不影响 JPEG 文件的查看。只是在文件头信息中增加了有关拍摄信息的内容和索引图。
所以你可以使用任何支持JPEG格式的图像工具软件观看或修改Exif文件,但打开时可能看不到Exif信息,一旦修改,Exif信息可能丢失。
Basically, Exif file format is the same as JPEG file format. Exif inserts some of image/digicam information data and thumbnail image to JPEG in conformity to JPEG specification.Therefore you can view Exif format image files by JPEG compliant Internet browser/Picture viewer/Photo retouch software etc. as a usual JPEG image files.
简单来说,EXIF 信息就是由数码相机在拍摄过程中采集一系列的信息,然后把信息放置在我们熟知的 JPEG/TIFF 文件的头部, 也就是说 EXIF 信息是镶嵌在 JPEG/TIFF 图像文件格式内的一组拍摄参数,主要包括摄影时的光圈、快门、ISO、日期时间等各种与当时摄影条件相关的讯息,相机品牌型号,色彩编码,拍摄时录制的声音以及全球定位系统(GPS)等信息。
EXIF文件格式说明
Exif可以附加于JPEG、TIFF、RIFF、CR2、NEF、XMP等文件之中——PNG规范中不包含嵌入式EXIF,
如何分析图片文件里面的Exif信息,截取图片文件里面的exif数据块?
Exif信息以0xFFE1作为开头标记,后两个字节表示Exif信息的长度。所以Exif信息最大为64 kb,而内部采用TIFF格式——Tagged Image File Format(标签图像文件格式——最初的设计目的是为了1980年代中期桌面扫描仪厂商达成一个公用的扫描图像文件格式,JPEG格式的数据也能被嵌进其他类型的文件格式中,像是TIFF类型的文件格式。)。
Every JPEG file starts from binary value '0xFFD8', ends by binary value '0xFFD9'. There are several binary 0xFFXX data in JPEG data, they are called as "Marker", and it means the period of JPEG information data. 0xFFD8 means SOI(Start of image), 0xFFD9 means EOI(End of image). These two special Markers have no data following, the other Markers have data with it. Basic format of Marker is below.
很多图片没有后缀,图片还是能识别,靠说明?
如何识别JEPG文件的
其实很简单,就是判断前面3个字节是什么,如果发现是FF D8 FF开始,那就认为它是JEPG图片。
JPG文件是由一段段的数据构成的组成的(segment),段的多少和长度并不是一定的。只要包含了足够的信息,该JPEG文件就能够被打开。
JPEG格式和标记
JPEG图片格式组成部分:SOI(文件头)+APP0(图像识别信息)+ DQT(定义量化表)+ SOF0(图像基本信息)+ DHT(定义Huffman表) + DRI(定义重新开始间隔)+ SOS(扫描行开始)+ EOI(文件尾)
以16进制模式打开JPG文件,就会发现
JPEG 文件中有一些形如 0xFF** 这样的数据,它们被称为“标志(Marker)”,它表示 JPEG 信息数据段。例如 0xFFD8 代表 SOI(Start of image), 0xFFD9 代表 EOI(End of image)。
标志 0xFFE0~0xFFEF 被称为 "Application Marker",它们不是解码 JPEG 文件必须的,可以被用来存储配置信息等。EXIF 也是利用这个标志段来插入信息的,具体来说,是 APP1(0xFFE1) Marker。所有的 EXIF 信息都存储在该数据段。
JPEG format and Marker
SOI Marker | Marker XX size=SSSS | Marker YY size=TTTT | SOS Marker size=UUUU | Image stream | EOI Marker | ||||||
FFD8 | FFXX | SSSS | DDDD...... | FFYY | TTTT | DDDD...... | FFDA | UUUU | DDDD.... | I I I I.... | FFD9 |
0xFFE0~0xFFEF之间的标记被叫做 "应用标记", 它们在JPEG图像解码中不是必须存在的. 它们被使用于用户的应用程序之中. 例如, 老款的olympus/canon/casio/agfa 数字相机使用 JFIF(JPEG文件交换格式/JPEG File Interchange Format)来存储图像. JFIF 使用 APP0(0xFFE0) 标记来插入数字相机的配置信息数据和缩略图.
Exif也使用应用标记来插入数据, 但是Exif 使用 APP1(0xFFE1)标记来避免与JFIF格式的 冲突. 且每一个 Exif 文件格式都开始于它, 如
SOI 标记 | 标记 XX 的大小=SSSS | 标记 YY 的大小=TTTT | SOS 标记 的大小=UUUU | 图像数据流 | EOI 标记 | ||||||
FFD8 | FFXXlo0p | SSSS | DDDD...... | FFYY | TTTT | DDDD...... | FFDA | UUUU | DDDD.... | I I I I.... | FFD9 |
Exif也使用应用标记来插入数据, 但是Exif 使用 APP1(0xFFE1)标记来避免与JFIF格式的 冲突. 且每一个 Exif 文件格式都开始于它, 如;
Marker used by Exif
0xFF+Marker Number(1 byte)+Data size(2 bytes)+Data(n bytes)
SOI Marker | APP1 Marker | APP1 Data | Other Marker |
FFD8 | FFE1 | SSSS 457869660000 TTTT...... | FFXX SSSS DDDD...... |
该图像文件从SOI(0xFFD8) 标记开始, 因此它是一个 JPEG 文件. 后面马上跟着 APP1 标记. 而它的所有 Exif数据都被存储在 APP1 数据域中. 上面的 "SSSS" 这部分表示 APP1 数据域 (Exif data area)的大小. 请注意这里的大小 "SSSS" 包含描述符本身的大小.
在 "SSSS"后面, 是 APP1 的数据. 其中第一个部分是一个特殊的数据,它用来标识是否是 Exif, 其值是ASCII 字符 "Exif" 和 两个0x00字节 的组合字符串.
在 APP1 标记域的后面是, 跟随着其他的 JPEG 标记
exif数据解析
如果图片图片是16进制数据,如下:
FF D8 FF E0 00 10 4A 46 49 46 00 01 02 01 00 60 00 60 00 00 FF E1 08 32 45 78 69 66 00 00 49 49 10 60 00 60 20 00 …… FFD9
那么FF D8为SOI标志位,FF E0为exif文件起始位,后面四位 为exif marker信息的长度。取这个长度的数据解析为TIFFdata数据,exif直接解析为字符串貌似也没有问题。
FF D8
FF E0 00 10 4A 46 49 46 00 01 02 01 00 60 00 60 00 00 mark0,00 10 =16位
FF E1 08 32 45 78 69 66 00 00 49 49 10 60 00 60 20 00 …… mark1,00 10 =2098位
……
Image stream
FFD9
exif marker数据结构
Exif的数据结构 (APP1)大致如下面那样. 这是"Intel"字节序的情况, 并且它包含了JPEG 格式的 缩略图. 就像上面描述的那样, Exif 数据开始于ASCII字符 "Exif" 和2个字节的0x00, 后面才是 Exif的数据. Exif 使用 TIFF 格式来存储数据. 想获取TIFF的更多的细节的话, 请参考 "TIFF6.0规格说明(TIFF6.0 specification)".
FFE1 | APP1 标记 | ||||
SSSS | APP1 数据 | APP1 数据大小 | |||
45786966 0000 | Exif 头 | ||||
49492A00 08000000 | TIFF 头 | ||||
XXXX. . . . | IFD0 (主图像) | 目录 | |||
LLLLLLLL | 连接到 IFD1 | ||||
XXXX. . . . | IFD0的数据域 | ||||
XXXX. . . . | Exif 子IFD | 目录 | |||
00000000 | 连接结束 | ||||
XXXX. . . . | Exif 子IFD的数据域 | ||||
XXXX. . . . | Interoperability IFD | Directory | |||
00000000 | 连接结束 | ||||
XXXX. . . . | Interoperability IFD的数据域 | ||||
XXXX. . . . | Makernote IFD | Directory | |||
00000000 | 连接结束 | ||||
XXXX. . . . | Makernote IFD的数据域 | ||||
XXXX. . . . | IFD1(缩略图像) | 目录 | |||
00000000 | 连接结束 | ||||
XXXX. . . . | IFD1的数据域 | ||||
FFD8XXXX. . . XXXXFFD9 | 缩略图像 |
Exif与TIFF
TIFF是一种图像文件格式,包含图像数据和元数据。由于其简单灵活,所以使用很广,具体阅读此篇《JPEG/Exif/TIFF格式解读(3):TIFF》
我们只需识别出他头部,然后解码出信息即可。这些信息,有个编码表,然后根据头部编码,然后解码里面的内容。
下面是官网给的文件格式说明,可以
Tags used by IFD0 (main image),图片文件基本的信息,包括日期、方向、白平衡
Tags used by Exif SubIFD,拍照是相机参数设置及其相关等基本信息,如曝光时间、IOS、亮度
Tags used by IFD1 (thumbnail image),图片存储相及显示关信息,
Misc Tags,文件描述及附加信息,如标题、艺术家,GPS位置信息等。
Tags used by IFD0 (main image)
Tag No. | Tag Name | Format | CompoNo | Desc. |
---|---|---|---|---|
0x010e | ImageDescription | ascii string | Describes image | |
0x010f | Make | ascii string | Shows manufacturer of digicam | |
0x0110 | Model | ascii string | Shows model number of digicam | |
0x0112 | Orientation | unsigned short | 1 | The orientation of the camera relative to the scene, when the image was captured. The start point of stored data is, '1' means upper left, '3' lower right, '6' upper right, '8' lower left, '9' undefined. |
0x011a | XResolution | unsigned rational | 1 | Display/Print resolution of image. Large number of digicam uses 1/72inch, but it has no mean because personal computer doesn't use this value to display/print out. |
0x011b | YResolution | unsigned rational | 1 | |
0x0128 | ResolutionUnit | unsigned short | 1 | Unit of XResolution(0x011a)/YResolution(0x011b). '1' means no-unit, '2' means inch, '3' means centimeter. |
0x0131 | Software | ascii string | Shows firmware(internal software of digicam) version number. | |
0x0132 | DateTime | ascii string | 20 | Date/Time of image was last modified. Data format is "YYYY:MM:DD HH:MM:SS"+0x00, total 20bytes. In usual, it has the same value of DateTimeOriginal(0x9003) |
0x013e | WhitePoint | unsigned rational | 2 | Defines chromaticity of white point of the image. If the image uses CIE Standard Illumination D65(known as international standard of 'daylight'), the values are '3127/10000,3290/10000'. |
0x013f | PrimaryChromaticities | unsigned rational | 6 | Defines chromaticity of the primaries of the image. If the image uses CCIR Recommendation 709 primearies, values are '640/1000,330/1000,300/1000,600/1000,150/1000,0/1000'. |
0x0211 | YCbCrCoefficients | unsigned rational | 3 | When image format is YCbCr, this value shows a constant to translate it to RGB format. In usual, values are '0.299/0.587/0.114'. |
0x0213 | YCbCrPositioning | unsigned short | 1 | When image format is YCbCr and uses 'Subsampling'(cropping of chroma data, all the digicam do that), defines the chroma sample point of subsampling pixel array. '1' means the center of pixel array, '2' means the datum point. |
0x0214 | ReferenceBlackWhite | unsigned rational | 6 | Shows reference value of black point/white point. In case of YCbCr format, first 2 show black/white of Y, next 2 are Cb, last 2 are Cr. In case of RGB format, first 2 show black/white of R, next 2 are G, last 2 are B. |
0x8298 | Copyright | ascii string | Shows copyright information | |
0x8769 | ExifOffset | unsigned long | 1 | Offset to Exif Sub IFD |
更多可以查看:https://www.media.mit.edu/pia/Research/deepview/exif.html
此篇是《JPEG/Exif/TIFF格式解读(5):exif marker Tag ID》
参考资料:
图片文件Exif信息详细说明 blog.sina.com.cn/s/blog_651251e60102uz3d.html#AboutExif
图像Exif信息 元数据(Metadata) https://www.jianshu.com/p/a6d67df60e7e
关于图片文件旋转JPEG与EXIF信息 https://blog.csdn.net/yulimin/article/details/102827865
https://www.media.mit.edu/pia/Research/deepview/exif.html
https://baike.baidu.com/item/Exif/422825?fr=aladdin
读取JPG图片的Exif属性(一) - Exif信息简介 https://blog.csdn.net/fioletfly/article/details/53605959
读取JPG图片的Exif属性(二) - C代码实现 https://blog.csdn.net/fioletfly/article/details/54094940
读取JPG图片的Exif属性(三) - Exif属性读取GPS信息代码(C/C++实现)https://blog.csdn.net/fioletfly/article/details/54133422
在jpg图片添加Exif信息的C程序实现 https://blog.csdn.net/psy6653/article/details/79658144
JPEG添加EXIF https://blog.csdn.net/weixin_43549602/article/details/84654965
jpeg图片格式详解 https://blog.csdn.net/yun_hen/article/details/78135122
压缩算法——JPEG2000 编解码原理 https://blog.csdn.net/ytang_/article/details/76571635
PNG、JPEG、BMP等几种图片格式详解 https://www.jianshu.com/p/f5557c0e689e
使用HTTP2和渐进式JPEG图片更快的加载图像 http
转载本站文章《JPEG/Exif/TIFF格式解读(2):图片元数据保存及EXIF详解》,
请注明出处:https://www.zhoulujun.cn/html/theory/multimedia/CG-CV-IP/8397.html