我正在开发一个程序,该程序要求在tiff文件中存在8BIM配置文件信息,以便继续处理。
打开并保存在Adobe Photoshop中时,样本tiff文件(不包含8BIM配置文件信息)会获取此元数据信息。
我对如何处理这个问题毫无头绪。 目标框架是.net 2.0。
任何与此相关的信息都会有所帮助。
答案 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标签中。