【问题标题】:PNG or JPEG With Custom Text Chunk带有自定义文本块的 PNG 或 JPEG
【发布时间】:2012-07-18 20:33:23
【问题描述】:

我通常喜欢问更精确的问题,但在这个问题中我没有找到任何好的开始。

使用 C# 编写,我正在尝试向图像添加一个大的自定义文本块并使用 JPEG 或 PNG 保存它。我发现了很多关于使用 Comments 或 UserComments 标签的例子,它们在文本相对较短的情况下起作用。在我的情况下,我需要添加潜在的大块文本,假设最多 256K。我找到了对“自定义块”的引用,但我找不到任何关于如何从 C# 编写和读取它们的好指针,而无需编写完整的自定义 JPG 或 PNG 编码器。

【问题讨论】:

  • JPEG 数据段的大小限制为 64K。为了对更大的数据块进行编码,您需要将其拆分为多个块。查看 JPEG 文件中的 ICC 颜色配置文件,了解如何执行此操作的示例。 PNG 或 JPEG 都可以完成您想要的操作,并且都很难将数据压缩到其中将被忽略。
  • 你好 Eric,有关于这个话题的消息吗?

标签: c# png jpeg exif


【解决方案1】:

我不确定 JPG,但 PNG 具有分块格式,因此应该很容易将自定义块添加到(编写良好的)现有解码器将忽略的文件中。该块可以包含您想要放入其中的任何数据。

您也不需要编写完整的 PNG 解码器,只需查找您的自定义块并读/写它。

编辑:JPEGs use segments(参见第 2 页)以分隔文件。根据我的研究,我没有看到任何添加自定义片段的方法 - 但可以使用未使用的片段 ID(解码器将跳过),如 JPG0、JPG13、DHP、EXP 或其他内容。您甚至可以将数据拆分为多个块以增加存储空间(正如@BitBank 所指出的那样)。

希望这会有所帮助!

【讨论】:

  • 感谢您的快速输入。是的,似乎 PNG 可以采用任意长度的自定义块。我找到了带有 C# 包装器的 FreeImage 库 (freeimage.sourceforge.net),并且快速测试似乎可以使用 XMP 作为块类型来编写和读取大块。此解决方案需要添加 2 个 DLL,这不是很理想,但目前可以使用。如果有人知道如何使用标准 .NET PngEncoder 添加任意长度的自定义块,请告诉我。
【解决方案2】:

你也可以试试this library,它允许读/写所有标准块(包括三个文本块)。最后一个示例here 创建了一个文本块。

【讨论】:

  • 感谢 RobIII 和 leonbloy 提供更多信息。现在我坚持使用 ImageFreeNet 库,因为它完成了这项工作,尽管我必须在我的可执行文件中包含一个额外的 DLL。这是一个很好的妥协,不必在这方面做更多的工作。顺便说一句,在 XMP 块上写入和读取文本时,FreeImageNet 似乎有一个错误。有时会在文本中添加一些额外的字符。我无法弄清楚导致它的确切情况,但它对于给定的文本始终有效/失败。我有一个解决方法,所以我现在已经准备好了。
【解决方案3】:

作为最简单的基本想法(例如“肮脏的黑客”):您不必“编写完整的自定义 JPG 或 PNG 编码器”。您可以像往常一样保存,然后打开文件,将“自定义块”中的内容放入并保存。

您可能需要解析一些 JPG/PNG 标头信息以了解可以放置块的偏移量,您甚至可能需要使用新偏移量更新一些标头,但总而言之,这可能不像编写一个完整的编码器那么工作。

请注意:我确实推荐这种方法,但如果所有其他选项要么工作量太大,要么太复杂,或者其他什么,那么至少,这是一个可以考虑的选项。 另外,我不知道这一点,但任何一种格式可能实际上甚至不支持这种“大”块“非图像数据”。

如果您的应用程序是唯一使用图像的应用程序,您可以简单地考虑以您自己的“格式”“包装”原始文件(可以是从包含图像 + 文本作为单独文件的 zip/gz 流到单个文件,可以是您自己的自定义文件格式)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    相关资源
    最近更新 更多