是否可以在图像文件中包含不会破坏它的额外信息?

时间:2012-12-12 04:56:37

标签: java image

我正在制作一个Java程序,我希望能够为图像文件添加额外的信息(只是纯文本,以后可以由同一个程序读取)。我正在考虑将它添加到第一行。

有没有办法添加这样的信息,而不会破坏图像文件。我可以以某种方式“评论”该文本,以便它不会被读取为图像二进制文件的一部分(就像在记事本中打开图像时,它会显示在那里)。

4 个答案:

答案 0 :(得分:2)

这被标记为Java,但一般来说,您可以修改图像文件的EXIF data

另请参阅:http://frickelblog.wordpress.com/2009/08/21/java-library-for-reading-writing-exif-xmp-and-iptc-in-jpegs/

答案 1 :(得分:2)

大多数图像文件格式允许任意元数据。 PNG图像包含“块”中的像素数据,颜色配置文件,版权等等 - 有关说明,请参阅http://www.libpng.org/pub/png/spec/1.2/PNG-Chunks.html。你可能想要一个iTXt或tEXt块。

JPEG还允许元数据。阅读JFIF和EXIF。请参阅此答案:https://stackoverflow.com/a/10699613/10468

有关特定于Java的答案,请参阅问题Writing image metadata in Java, preferably PNG

Find JPEG resolution with PHP中可能还有一些有用的信息,尽管这个问题询问的是PHP而不是Java。

目前看不到TIFF,但这种格式允许您想要存储的任何数据的各种额外数据和用户定义标签。

我知道没有图像文件格式,您可以在文本编辑器中打开或在命令行打印,这将显示为文本元数据而不是像素中的乱码。但是,可以定义这样的文件格式 - 如果文件以文本开头,有一个EOT(ascii 03)(iirc)然后继续二进制,大多数文本命令行工具和可能的文本编辑器将处理文本罚款并停在EOT。我不确定它适用于所有平台。

答案 2 :(得分:0)

您可以使用Image Steganography隐藏文字。以下是一些可以帮助您完成此操作的链接:Images' Steganography

Steganography - Hiding messages in the Noise of a Picture

答案 3 :(得分:0)

是的,有可能。我解释一下算法:

  1. 您需要屏蔽以使图像的最低有效位的最后一位为零。首先一点一点,看看对图像的影响。然后将最后两个位更改为零,以查看图像受到的影响。继续进行此操作,以找出可以变为零的位数,而不会影响图像质量。
  2. 获取短信的二进制内容。
  3. 计算文本消息的二进制内容的长度。您需要使用此值将此值保存在图像的前几个字节中。稍后,您将使用它来了解检索消息所需读取的像素数。

这是主要部分:

  1. 假设您只将图像的最后一位设为零,并且为消息长度保留了前16位,那么将需要保留前16个像素以保存消息的长度。将消息长度的二进制值(例如bin(114))保存在前16个像素的最后一位中。您可能需要在右边填充零以使其匹配。
  2. 从像素17开始,将消息逐位保存在每个像素的最后一位。
  3. 要检索嵌入的消息,请读取前16个像素,构造长度以知道要读取多少像素才能重建消息。

您甚至可以在图像中保存其他图像或语音信号。我知道这篇文章被标记为Java,但是给您一个思路,您可以看一下我的python代码在this_github_link中实现相同功能的python代码,该文件位于stagenography_embed_text_in_image.py文件中。我还解释了在此stackoverflow_post中保存其他类型信息的算法。

希望它会清楚。