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



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

有没有一种方法可以添加这样的信息,而不会损坏图像文件。我能不能以某种方式对文本进行"注释",这样它就不会作为图像二进制文件的一部分读取(比如当你在记事本中打开图像时,它会显示在那里)。

这被标记为Java,但通常情况下,您可以修改图像文件的EXIF数据。

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

大多数图像文件格式都允许使用任意元数据。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(最好是PNG)编写图像元数据以获得一些特定于Java的答案。

虽然这个问题问的是PHP而不是Java,但在使用PHP查找JPEG分辨率中也可能有有用的信息。

TIFF现在不常见了,但这种格式允许为您想要存储的任何数据提供各种各样的额外数据和用户定义的标记。

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

您可以使用图像分段术来隐藏文本。这里有一些链接可以帮助你做到这一点:图像的隐写

隐写术-在图像的噪声中隐藏消息

是的,这是可能的。我解释算法:

  1. 您需要制作一个掩码,使图像的最低有效位的最后一位为零。先做一点,看看对你形象的影响。然后将最后两位更改为零,看看您的图像是如何受到影响的。继续这样做,可以计算出在不影响图像质量的情况下可以将多少位变为零
  2. 获取短信的二进制内容
  3. 计算短信的二进制内容的长度。您需要将此值保存在图像的前几个字节中。稍后您将使用它来了解需要读取多少像素才能检索消息

这是主要部分:

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

您甚至可以在图像中保存另一个图像或语音信号。我知道这篇文章被标记为Java,但为了给你一个想法,你可以看看我的python代码在this_github_link中实现了同样的东西;stagenography_embed_ext_in_image.py";。此外,我还解释了在这个stackoverflow_post中保存其他类型信息的算法。

希望它能说清楚。

最新更新