将8BIM配置文件元数据添加到tiff图像文件

时间:2014-02-13 01:21:19

标签: c# .net image-processing metadata tiff

我正在开发一个程序,该程序要求在tiff文件中存在8BIM配置文件信息,以便继续处理。

打开并保存在Adobe Photoshop中时,样本tiff文件(不包含8BIM配置文件信息)会获取此元数据信息。

我对如何处理这个问题毫无头绪。 目标框架是.net 2.0。

任何与此相关的信息都会有所帮助。

1 个答案:

答案 0 :(得分:3)

不知道为什么你需要8BIM出现在你的TIFF文件中。我将提供一些关于8BIM的一般信息和结构。

8BIM是Photoshop图像资源块(IRB)的签名。这类信息可以在TIFF,JPEG,Photoshop原生图像格式等图像中找到。也可以在非图像文档中找到,例如PDF格式。

IRB的结构如下:

每个IRB块以4字节签名开头,转换为字符串" 8BIM。"之后,是一个2字节的唯一标识符,表示此IRB的资源类型。例如:缩略图为0x040c;切片为0x041a; 0x0408表示网格信息; 0x040f用于ICC配置文件等。

标识符是name的可变长度字符串之后。字符串的第一个字节表示字符串的长度(不包括第一个长度字节)。在第一个字节后出现字符串本身。要求整个字符串的长度(包括长度字节)应该是偶数。否则,在字符串后再填充一个字节。

接下来的4个字节指定此资源块的实际数据大小,后跟指定长度的数据。数据的总长度也应该是偶数。因此,如果数据的大小是奇数,则填充另一个字节。这完成了整个8BIM。

可能有多个IRB,但它们都符合上述相同的结构。如何解释数据取决于唯一标识符。

现在让我们看看IRB是如何包含在图像中的。对于JPEG图像,元数据可以作为应用程序(APPn)段之一存在。由于不同的应用程序可以使用相同的APPn段来存储它自己的元数据,因此必须存在某种标识符以使图像读取器知道APPn内包含什么类型的信息。 Photoshop使用APP13作为其IRB容器,APP13包含" Photoshop 3.0"作为它的标识符。

对于基于标签并排列在目录结构中的TIFF图像。有一个私人标签0x8649叫做#34; PHOTOSHOP"插入IRB信息。

让我们来看看TIFF图片格式(引自this来源):

  

TIFF文件的基本结构如下:

     

前8个字节构成标题。其前两个字节是   要么" II"用于小端字节排序或" MM"对于大端   字节排序。接下来我们将假设大端序。   注意:任何真正的TIFF读取软件都应该同时处理   类型。标头的下两个字节应为0和42dec(2ahex)。   标题的剩余4个字节是从开头的偏移量   该文件到第一个"图像文件目录" (IFD),这通常   遵循它适用的图像数据。在下面的例子中有   只有一个图像和一个IFD。

     

IFD由两个字节组成,表示后面的条目数   由条目本身。 IFD以4字节偏移量终止   下一个IFD,如果没有,则为0。 TIFF文件必须至少包含   一个IFD!

     

每个IFD条目由12个字节组成。前两个字节标识   标记类型(如标记图像文件格式)。接下来的两个字节是   字段类型(byte,ASCII,short int,long int,...)。接下来的四个   bytes表示值的数量。最后四个字节是   值本身或值的偏移量。考虑第一个IFD   从以下示例gievn进入:

       0100 0003 0000 0001 0064 0000
       |    |    |         |
 tag --+    |    |         |
 short int -+    |         |
 one value ------+         |
 value of 100 -------------+

为了能够阅读TIFF IFD,必须先做两件事:

  • 一种能够读取大端或小端数据的方法
  • 一个随机访问输入流,它包装图像输入,以便我们可以在读取目录时向前和向后跳转。

现在让我们假设我们有一个名为Entry的每12字节IFD条目的结构。我们读取前两个字节(此处未应用字节顺序,因为它是MM或II)以确定字节顺序。现在我们可以阅读剩余的IFD数据,并根据我们已经知道的结束语来解释它们。

现在我们有一个Entry列表。将新条目插入列表并不困难 - 在我们的例子中,它是一个" Photoshop"条目。困难的部分是如何将数据写回来创建新的TIFF。您不能直接将条目写回输出流,这将打破中断 TIFF的整体结构。必须注意跟踪写入数据的位置并相应地更新数据指针。

从上面的描述中,我们可以看到将新条目插入TIFF格式并不容易。鉴于每个JPEG段都是自包含的,JPEG格式将使其变得更加容易。

我没有相关的C#代码,但有一个Java库here可以操作JPEG和TIFF图像的元数据,如插入EXIF,IPTC,缩略图等作为8BIM。在您的情况下,如果文件大小不是一个大问题,上面提到的库可以将一个小缩略图作为一个8BIM插入到Photoshop标签中。