Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将8BIM配置文件元数据添加到tiff图像文件_C#_.net_Image Processing_Metadata_Tiff - Fatal编程技术网

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

C# 将8BIM配置文件元数据添加到tiff图像文件,c#,.net,image-processing,metadata,tiff,C#,.net,Image Processing,Metadata,Tiff,我正在开发一个程序,该程序要求tiff文件中存在8BIM配置文件信息,以便继续处理 在Adobe Photoshop中打开并保存的示例tiff文件(不包含8BIM配置文件信息)将获取此元数据信息 我不知道如何处理这个问题。 目标框架是.NET2.0 任何与此相关的信息都会很有帮助。不知道为什么需要在TIFF文件中显示8BIM。我将只提供一些关于8BIM的一般信息和结构 8BIM是Photoshop图像资源块(IRB)的签名。这类信息可以在TIFF、JPEG、Photoshop原生图像格式等图像中

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

在Adobe Photoshop中打开并保存的示例tiff文件(不包含8BIM配置文件信息)将获取此元数据信息

我不知道如何处理这个问题。 目标框架是.NET2.0


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

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

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

内部评级机构的结构如下:

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

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

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

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

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

用于TIFF图像,该图像基于标记并排列在目录结构中。有一个名为“PHOTOSHOP”的私有标记0x8649,用于插入IRB信息

让我们看一下TIFF图像格式(引自来源):

TIFF文件的基本结构如下所示:

头8个字节构成头。其中的前两个字节是 “II”表示小端字节顺序,或“MM”表示大端字节顺序 字节排序。在下面的内容中,我们将假设big-endian排序。 注意:任何真正的TIFF阅读软件都应该同时处理这两个问题 类型。标题的下两个字节应该是0和42dec(2ahex)。 头的剩余4个字节是从开始的偏移量 将文件发送到第一个“映像文件目录”(IFD),这通常是 遵循它应用于的图像数据。在下面的示例中,有 只有一个图像和一个IFD

IFD由两个字节组成,指示后面的条目数 由参赛者自己决定。IFD以4字节的偏移量终止到 下一个IFD或0(如果没有)。TIFF文件必须至少包含 一个IFD

每个IFD条目由12个字节组成。前两个字节表示 标记类型(与标记图像文件格式相同)。接下来的两个字节是 字段类型(字节、ASCII、短整型、长整型等)。接下来的四个 字节表示值的数量。最后四个字节是 值本身或值的偏移量。考虑到第一个IFD 下面示例gievn中的条目:

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

  • 一种能够读取大端或小端数据的方法
  • 一种随机访问输入流,它包装图像输入,以便我们在读取目录时可以向前和向后跳转
现在让我们假设每个12字节的IFD条目都有一个称为entry的结构。我们读取前两个字节(这里不应用endianess,因为它是MM或II)来确定endianess。现在我们可以读取剩下的IFD数据,并根据我们已经知道的endianess解释它们

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

从上面的描述可以看出,将新条目插入TIFF格式并不容易。由于每个JPEG段都是独立的,因此JPEG格式将使它变得更加容易


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

我不是c#开发者,但8BIM块是Photoshop资源块。从现在开始,您似乎需要在TIFF文件中写入一个34377 TIFF标记,并使用完整的Photoshop资源块(以字节为单位)作为标记值。然而,一个重要的问题是:资源块中需要显示哪些信息?IPTC数据?任何字段都可以。只是当您通过imagemagik Profile-8bim进行检查时,Profile-8bi应该列在Profiles部分中
       0100 0003 0000 0001 0064 0000
       |    |    |         |
 tag --+    |    |         |
 short int -+    |         |
 one value ------+         |
 value of 100 -------------+