图像内的额外数据(PPM / PAM / PNM)

时间:2014-05-12 14:50:49

标签: image ffmpeg netpbm

是否可以以二进制PNM文件的像素存储额外数据,使其仍然可以作为图像读取(希望由任何解码器,但特别是ffmpeg)?

我有一个模拟,它将数据保存为当前的PPM,我喜欢在文件中记录每个像素超过三个值的方法,但仍然能够将其用作图像(显然只有前三个/四个值实际上会影响图像。)

在粒子中我认为PAM的TUPLTYPE应该允许我这样做,但我不知道如何制作一些可读的图像。

2 个答案:

答案 0 :(得分:1)

我没有使用PNM文件格式,但我用.bmp文件完成了这个技巧。

劫持图像数据的最低位,并用你想要的任何二进制数据填充它。没有人会看到0或1(00000000或00000001)的像素值或254或255(1111110或11111111)之间的差异。对于每8个字节的图像数据,可以嵌入一个字节的额外数据(如果使用有限的字符集,则为6个字节)。文件查看软件不会有任何区别。任何可以在编码之前打开文件的软件都能够在之后读取它。

如果您希望数据更隐蔽/隐藏,可以使用随机例程将这些位填充到图像数据中,其中第一位可能是位置50,第二位可能是123,第三位是32 ...在使用位置0-255(如果是图像数据的前256个字节)之后(额外数据的前32个字节),再次启动随机播放。

答案 1 :(得分:1)

在PAM文件中,有两个技巧可以在每个像素中共同增加5个额外字节。

第一招:

您可以尝试在Alpha通道中存储其他信息字节,然后选择在解码器中忽略该信息。在PAM中启用Alpha通道是通过将_APLHA添加到TUPLTYPE参数来完成的,因此TUPLTYPE RGB代替TUPLTYPE RGB_ALPHA

第二招:

您可以将PAM中的MAXVAL(或PPM中的等效字段及其他字段)设置为65535而不是255,这意味着每个像素将由三个16位值描述而不是三个8位的。现在,对于这些16位值,8 最低有效位可用于存储信息,因为它们在典型的计算机屏幕上显示时不会影响图像的视觉属性。

第一个+第二个技巧:

这为RGB平面提供了额外的3 x 8 = 24位,在alpha通道中提供了16位。这意味着:5个字节。