是否可以以二进制PNM文件的像素存储额外数据,使其仍然可以作为图像读取(希望由任何解码器,但特别是ffmpeg)?
我有一个模拟,它将数据保存为当前的PPM,我喜欢在文件中记录每个像素超过三个值的方法,但仍然能够将其用作图像(显然只有前三个/四个值实际上会影响图像。)
在粒子中我认为PAM的TUPLTYPE应该允许我这样做,但我不知道如何制作一些可读的图像。
答案 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个字节。