是否可以将额外的数据存储在二进制 PNM 文件的像素中,使其仍然可以作为图像读取(希望任何解码器,但特别是 ffmpeg)?
我有一个模拟,目前将其数据保存为 PPM,我想要一种方法来记录文件中每个像素的三个以上的值,但仍然能够将其用作图像(显然只有前三个/四个值实际上会影响图像)。
在粒子中,我认为 PAM 的 TUPLTYPE 应该允许我这样做,但我不知道如何从中制作出可读图像。
有两个技巧可以在 PAM 文件中为每个像素增加多达 5 个额外的字节。
第一个技巧:
您可以尝试在 alpha 通道中存储额外的信息字节,然后选择在解码器中忽略该信息。在 PAM 中启用 alpha 通道是通过添加参数_APLHA
来完成的TUPLTYPE
,所以TUPLTYPE RGB
你有TUPLTYPE RGB_ALPHA
.
第二招:
您可以MAXVAL
在 PAM(或 PPM 等中的等效字段)中设置为65535
代替255
,这意味着每个像素将由三个 16 位值而不是三个 8 位值来描述。现在,对于这些 16 位值,8 个最低有效位可用于存储信息,因为它们不会影响图像在典型计算机屏幕上显示时的视觉属性。
第一+第二招:
这为您提供了额外的 3 x 8 = 24 位用于 RGB 平面和 16 位用于 Alpha 通道。这意味着:5 个字节。
我没有使用过 PNM 文件格式,但我用 .bmp 文件完成了这个技巧。
劫持图像数据的最低有效位,并用您想要的任何二进制数据填充它。没有人会看到 0 或 1(00000000 或 00000001)的像素值之间的差异,或者 254 或 255(1111110 或 11111111)之间的差异。对于每 8 个字节的图像数据,可以嵌入一个字节的额外数据(如果使用有限的字符集,则为 6 个字节)。文件查看软件不会有任何区别。任何可以在编码之前打开文件的软件,都可以在之后读取它。
如果您希望数据更加隐蔽/隐藏,可以使用 shuffle 例程将这些位填充到图像数据中,其中第一位可能是位置 50,第二位可能是位置 50,第二位可能是 123,第三位可能是 32... 以及位置之后使用 0-255(前 256 个字节,如果是图像数据)(前 32 个字节的额外数据),再次开始 shuffle。