• home > theory > multimedia > CG-CV-IP >

    JPEG/Exif/TIFF格式解读(2):图片元数据保存及EXIF详解

    Author:zhoulujun Date:

    JPG图片是如何存储GPS 快门 旋转等数据的,Exif 是什么,记录了哪些信息,为什么EXIF能插入JPEG文件。exif如何识别如何解码。

    图片元数据(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上,图片元数据查看就是就是图片文件的 【属性】——>【详细信息】 这一页,如下图所示:

    3285850-03434dcfd7c66f8c.jpeg


    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 formatExif 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(文件尾)

    003yXckxzy7poBkOYsf57&690.jpeg

    以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 MarkerMarker XX size=SSSSMarker YY size=TTTTSOS Marker size=UUUUImage streamEOI Marker
    FFD8FFXXSSSSDDDD......FFYYTTTTDDDD......FFDAUUUUDDDD....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 的大小=TTTTSOS 标记 的大小=UUUU图像数据流EOI 标记
    FFD8FFXXlo0pSSSSDDDD......FFYYTTTTDDDD......FFDAUUUUDDDD....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 MarkerAPP1 MarkerAPP1 DataOther Marker
    FFD8FFE1SSSS 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

    jpeg二进制代码源码分析


    exif marker数据结构

    Exif的数据结构 (APP1)大致如下面那样. 这是"Intel"字节序的情况, 并且它包含了JPEG 格式的 缩略图. 就像上面描述的那样, Exif 数据开始于ASCII字符 "Exif" 和2个字节的0x00, 后面才是 Exif的数据. Exif 使用 TIFF 格式来存储数据. 想获取TIFF的更多的细节的话, 请参考 "TIFF6.0规格说明(TIFF6.0 specification)".

    FFE1APP1 标记
    SSSSAPP1 数据APP1 数据大小
    45786966 0000Exif 头
    49492A00 08000000TIFF 头
    XXXX. . . .IFD0 (主图像)目录
    LLLLLLLL连接到 IFD1
    XXXX. . . .IFD0的数据域
    XXXX. . . .
    Exif 子IFD目录
    00000000连接结束
    XXXX. . . .Exif 子IFD的数据域
    XXXX. . . .
    Interoperability IFDDirectory
    00000000连接结束
    XXXX. . . .Interoperability IFD的数据域
    XXXX. . . .Makernote IFDDirectory
    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 NameFormatCompoNoDesc.
    0x010eImageDescriptionascii string
    Describes image
    0x010fMakeascii string
    Shows manufacturer of digicam
    0x0110Modelascii string
    Shows model number of digicam
    0x0112Orientationunsigned short1The 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.
    0x011aXResolutionunsigned rational1Display/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.
    0x011bYResolutionunsigned rational1
    0x0128ResolutionUnitunsigned short1Unit of XResolution(0x011a)/YResolution(0x011b). '1' means no-unit, '2' means inch, '3' means      centimeter.
    0x0131Softwareascii string
    Shows firmware(internal software of digicam) version number.
    0x0132DateTimeascii string20Date/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)
    0x013eWhitePointunsigned rational2Defines 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'.
    0x013fPrimaryChromaticitiesunsigned rational6Defines 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'.
    0x0211YCbCrCoefficientsunsigned rational3When 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'.
    0x0213YCbCrPositioningunsigned short1When 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.
    0x0214ReferenceBlackWhiteunsigned rational6Shows 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.
    0x8298Copyrightascii string
    Shows copyright information
    0x8769ExifOffsetunsigned long1Offset 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