技术 / 计算机图形图像 · 2019年2月27日 1

DNG格式详解(一)

DNG(Digital Negative 数字负片)格式,是一个开放的、免费授权使用的、无损的RAW(原始图像)格式,由Adobe编写,用于数码摄影。DNG推出于2004年09月27日,最新版本为2012年09月发布的1.4.0.0版本(https://helpx.adobe.com/photoshop/digital-negative.html)。

由于其开放及免费的特性,DNG已成为应用最广泛的RAW格式类型,大部分通用专业图像编辑软件均予以支持,徕卡(Leica)、卡西欧(Casio)、理光(Ricoh)、三星(Samsung)、宾得(Pentax)等相机制造厂商也均将其作为旗下相机产品的默认RAW图像存储格式。

DNG是TIFF 6.0的扩展,因此,标准的DNG格式文件应符合所有的TIFF 6.0格式标准。关于TIFF 6.0的详细信息,参见Adobe官方的介绍(https://www.adobe.io/open/standards/TIFF.html)。

一、文件扩展名

对于DNG格式,Adobe官方推荐的存储扩展名为".DNG",同时为了与TIFF/EP(Tag Image File Format / Electronic Photography)兼容,亦允许使用".TIF"扩展名存储。

二、一个标准DNG文件包含的内容

对于DNG文件,与大多数RAW文件一样,包含有创建一个可视图像所必须的相机传感器数据信息。DNG、ISO标准RAW图像格式(ISO12234-2)、TIFF/EP,往往遵循相同的范式:

  • 1.一个短的文件头,它通常包含文件的字节顺序,文件标识符和主数据的文件偏移量摄像传感器元数据,用来描述图像传感器的数据,包括传感器的尺寸, 颜色滤波矩阵(color filter array)的属性和它的颜色配置文件;
  • 2.列入任何CMS环境或数据库中需要的图像元数据。这些措施包括曝光设定,相机/扫描仪/镜头模型,拍摄/扫描日期(和可选的位置信息),创作信息和其他。一些原始文件包含可交换图像格式的标准化元数据节;
  • 3.图像缩略图;
  • 4.可选的JPEG格式缩小尺寸的图像,可用于快速预览;
  • 5.在电影胶片扫描中,无论是文件序列的时间码,序列码或帧编号都代表在扫描卷轴中的帧顺序。这个项目允许文件被被按帧顺序排列(不依赖于它的文件名​);
  • 6.传感器图像数据;

三、子图像文件目录树(SubIFD trees,IFD=Image File Directory)

在DNG格式中,Adobe推荐使用子图像文件目录树(SubIFD trees)的形式进行存储,DNG不支持子图像文件目录链(SubIFD chains)。

子图像文件目录树
子图像文件目录树

最高分辨率和图像质量下,图像文件目录中(IFD)的NewSubFileType值应为0。如果在DNG文件中包含有低分辨率或低质量的图像预览/缩略图等,则其NewSubFileType属性应设置为1(主预览文件)或者10001.H(副预览文件)。

和TIFF/EP规范中所描述的一样,Adobe推荐但并不强制要求在第一个图像文件目录(IFD)中包含一个低分辨率的缩略图。

四、字节顺序(Byte Order)

所有符合DNG标准的读取软件或者写入软件均应支持所有的字节顺序,无论大端还是小端顺序,这样对于写入设备的设计制造来说更加简单和快捷。

五、屏蔽像素(Masked Pixel)

为了测量黑色编码的量级,大多数图像传感器的边缘均包含有一部分被完全遮光处理的像素。传感器所生成的图像上,这一部分像素信息可以在图像被存入DNG文件之前被修剪掉,也可以不经修剪直接包含入图像文件中。如果这些被屏蔽的像素信息没有被修剪掉,那么,其它未被屏蔽的像素信息需要在DNG文件中使用ActiveArea标签进行标注。

六、缺陷像素(Defective Pixels)

对于DNG文件中存在缺陷或损坏的像素的情况,有两种解决方法。一种是使用插值法在存储原始图像信息到DNG文件之前将这些像素标记出来。另一种,则是在DNG文件的OpcodeList1标签中包含一个针对修复损坏像素的操作代码。

七、元数据(Metadata)

附加的元数据要嵌入到DNG文件中的话,可以使用这几种方式:

  • 使用TIFF/EP或者EXIF元数据标签
  • 使用IPTC元数据标签(33723)
  • 使用XMP元数据标签(700)

需要注意的是,TIFF/EP和EXIF所使用的元数据标签设置几乎相同,不一样的是,TIFF/EP将这些标签存储在IFD 0(图像文件目录0)中,而EXIF将这些标签存储在一个独立的图像文件目录(IFD)中。两种存储方式在DNG规范中都是允许的,但是一般更倾向于EXIF形式。

八、专有数据(Proprietary Data)

相机制造厂商可能会希望在使用他们自己的RAW文件转码工具时,将一些专有的数据注入到RAW文件中。对于这种情况,DNG规范允许使用私有标签(Private Tags)、私有图像文件目录(IFDs)与/或MakerNote标签来存储这些专有数据。

推荐在DNG文件中使用DNGPrivateData或者MakerNoteSafety标签来存储专有数据,这样可以确保DNG文件在被编辑过后仍能保留这些数据。

九、相机描述(Camera Profiles)

DNG 1.2.0.0 以及之后的规范逐渐确立了“相机描述”的概念,并允许在同一个DNG文件中嵌入多个相机描述。

相机描述由一系列的标签所构成(既有1.2.0.0之前版本规范中即存在的标签,也有在1.2.0.0版本中新加入的标签),其中一部分是可选的。

相机描述包含以下标签:

  • BaselineExposureOffset(基本曝光补偿)
  • CalibrationIlluminant1(校正光源1)
  • CalibrationIlluminant2(校正光源2)
  • ColorMatrix1(颜色矩阵1)
  • ColorMatrix2(颜色矩阵2)
  • DefaultBlackRender(默认黑场渲染)
  • ForwardMatrix1(前部矩阵1)
  • ForwardMatrix2(前部矩阵2)
  • ProfileCalibrationSignature(描述校正签名)
  • ProfileCopyright(描述版权)
  • ProfileEmbedPolicy(描述嵌入政策)
  • ProfileHueSatMapData1(描述色调及饱和度映射数据1)
  • ProfileHueSatMapData2(描述色调及饱和度映射数据2)
  • ProfileHueSatMapDims(描述色调及饱和度映射尺寸)
  • ProfileHueSatMapEncoding(描述色调及饱和度编码)
  • ProfileLookTableData(描述查找表数据)
  • ProfileLookTableDims(描述查找表尺寸)
  • ProfileLookTableEncoding(描述查找表编码)
  • ProfileName(描述名称)
  • ProfileToneCurve(描述色调曲线)
  • ReductionMatrix1(简化矩阵1)
  • ReductionMatrix1(简化矩阵1) 主要的相机描述存储在IFD 0(图像文件目录 0)中,这是在低于1.2.0.0版本的DNG规范中即存在的形式,是为了对一些旧的DNG读取软件实现向下兼容。DNG规范允许使用ExtraCameraProfiles标签嵌入额外的相机描述信息,这个标签指向一个相机描述图像文件目录(Camera Profile IFDs)的列表。

十、操作代码列表(Opcode Lists)

DNG 1.3.0.0和之后的规范加入了“操作代码列表”的概念,这将允许使用可扩展的方式来指定额外的操作步骤。

这一创新将复杂而繁重的处理任务从相机硬件上释放出来,留给后期的软件操作。因为相机的电源通常是很有限而需要着重考虑的,而后期软件操作时所使用的硬件设备处理性能也远比相机自身要强大得多。

同时,这也使得我们可以指定一些操作步骤,比如镜头矫正。理想情况下,镜头矫正应当在图像数据被去马赛克化(Demosaic)的同时进行。将这一操作指定在操作代码列表中也可以更好地保留了RAW格式原始马赛克数据的优点。

控制操作代码列表的标签有:

  • OpcodeList1(操作代码列表1)
  • OpcodeList2(操作代码列表2)
  • OpcodeList3(操作代码列表3)

十一、浮点图像数据(Floating Point Image Data)

DNG 1.4.0.0和之后的规范支持浮点图像数据,作为对之前所支持的无符号整型图像数据(Unsigned Integer Image Data)的扩充。

DNG规范支持每个样本16、24和32位的浮点位深。

十二、透明像素(Transparent Pixels)

DNG 1.4.0.0和之后的规范加入了“透明像素”的概念,这将允许在图像数据中指定像素的透明度。对于并非所有在图像矩形范围内的像素均被定义的情形会比较有用。

举个例子,当从多个源图像合成一个全景图时,得到的图像的边缘通常并非是完美的矩形。

要支持透明像素,需允许以和图像文件目录相同的宽度和长度来存储透明遮罩,同时NewSubFileType标签的值应设置为4或5。

全透明像素(即未定义像素)在存储时应使用参数值为0的透明遮罩。对于完全不透明像素(被定义)的存储,如使用浮点遮罩,应使参数值为1;如使用整型遮罩,应使得参数值为尽可能最大的无符整型数值。在这两者中间的数值可用来定义半透明像素。

对于半透明像素的存储,图像参数不应设置为黑或白,而应和完全不透明的情形采用相同的设置。

十三、代理DNG文件(Proxy DNG Files)

DNG 1.4.0.0 规范加入了代理DNG文件的概念,这是原始DNG文件的低分辨率或低质量版本。这种代理DNG文件主要作为占位符运用于具有较有限带宽或存储空间的应用程序。

代理DNG文件中包含有原始文件的像素尺寸信息,使得应用程序在运用渲染参数到代理文件和原始文件时拥有接近的视觉效果。

对应的原始DNG文件的尺寸信息可在OriginalDefaultFinalSize、OriginalBestQualitySize和OriginalCropSize标签中予以指定。

同样加入DNG 1.4.0.0规范的还有一个新的有损JPEG压缩选项,对于代理DNG文件尤其有用,能够大大减少文件大小。

参考文献:

  1. Adobe官方对于DNG格式的介绍页:https://helpx.adobe.com/photoshop/digital-negative.html
  2. Adobe官方对于TIFF格式的介绍页:https://www.adobe.io/open/standards/TIFF.html
  3. Adobe DNG Spec 1.4.0.0:https://www.adobe.com/content/dam/acom/en/products/photoshop/pdfs/dng_spec_1.4.0.0.pdf
  4. Maddock的博客:http://www.cnblogs.com/adong7639/p/4446828.html