【问题标题】:Adding 8BIM profile metadata to a tiff image file将 8BIM 配置文件元数据添加到 tiff 图像文件
【发布时间】:2014-02-13 01:21:19
【问题描述】:

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

在 Adob​​e Photoshop 中打开和保存的示例 tiff 文件(不包含 8BIM 配置文件信息)会获取此元数据信息。

我不知道如何解决这个问题。 目标框架是.net 2.0。

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

【问题讨论】:

  • 我不是 c# 开发人员,但 8BIM 块是 Photoshop 资源块。从this document 看来,您似乎需要将一个 34377 TIFF 标记(以完整的 Photoshop 资源块(以字节为单位)作为标记值)写入您的 TIFF 文件。一个重要的问题是:资源块中需要存在哪些信息? IPTC 数据?
  • 任何字段都可以。只是当您通过 imagemagik 进行检查时 Profile-8bim 应该列在 Profiles 部分 Profile-8bim 下:3xxxx bytes Web 充满了使用 BitmapMetadata 类的示例。我无法使用它,因为目标框架是 2.0

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


【解决方案1】:

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

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

IRB的结构如下:

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

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

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

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

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

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

我们来看看TIFF图像格式(引用自this来源):

TIFF文件的基本结构如下:

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

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

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

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

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

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

现在假设我们为每个 12 字节的 IFD 条目都有一个结构,称为 Entry。我们读取前两个字节(这里不应用字节序,因为它是 MM 或 II)来确定字节序。现在我们可以读取剩余的 IFD 数据并根据我们已经知道的字节序对其进行解释。

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

从上面的描述可以看出,将新的Entries插入TIFF格式并不是那么容易。鉴于每个 JPEG 片段都是独立的,因此 JPEG 格式会更容易。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 2010-09-08
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 2013-11-10
    相关资源
    最近更新 更多