2

出于好奇,这是一个关于我在十六进制编辑器中查看 JPG 文件时看到的一些模式的问题。我猜这是关于JPEG文件格式的问题;为什么这部分不像其他部分一样是“随机噪声”,而应该是(霍夫曼编码等)。

开始:

这种 136 位(17 字节)模式出现在一些由 Adob​​e Photoshop 生成的 JPG 文件中(我不知道 Photoshop 是否是唯一生成这些文件的应用程序):

F7 5E EB DE FD D7 BA F7 BF 75 EE BD EF DD 7B AF 7B

它在一个文件中有几个地方,有时只是一次迭代,有时会重复 8 或 12 次,组成 1088 位或 1632 位的块。或者更准确地说,它实际上是一个 68 位的模式,重复了 2 次或更多次:

F7 5E EB DE FD D7 BA F7 B

11110111010111101110101111011110111111011101011110111010111101111011

AFAIK 通过阅读有关 JPG 文件结构的一些信息,并以十六进制验证这一点,即 JPG 文件结构的开头标有 FF xx。在这些 68 位模式之前或之后都没有这样的 FF xx 结构标记。

通过使用 Breakpoint Hex Workshop,很容易在“数据可视化器”窗口中发现这些模式;虽然霍夫曼比特流的其余部分看起来像“噪音”,但突然有块显示出清晰的模式。

另外..我不确定这有多相关,但是..:

早些时候,我在 CR2 文件中也注意到了这样一种模式,即 Canon RAW 文件;不过,这里的模式是一个更简单的 40 位模式:

73 9C E7 39 CE

0111 0011 1001 1100 1110 0111 0011 1001 1100 1110

如果我调整空格,它会变成这样:

01110 01110 01110 01110 01110 01110 01110 01110

如您所见,这实际上是一个重复的5 位模式,它在 CR2 文件中出现的每个位置都重复了数百次。CR2 文件格式也是压缩文件,但无损。再说一遍,如果我理解正确的话,JPG 中的霍夫曼编码也是一种无损“压缩”。

我觉得很奇怪,在压缩流中,有这些(对我来说似乎是)“浪费”位的模式..

我在这里上传了一个 JPG 文件http://i.imgur.com/t0mi7vo.jpg - 这只是文件夹中一些文件的简单截图。霍夫曼码比特流从偏移量 0x0000027C 到末尾,您可能会看到重复模式的实例之一,例如偏移量 0x0001604A

4

2 回答 2

0

User3344003,非常非常感谢您回答,99.9% 正确..!:-)

正如您所写,这些图案与大面积的颜色有关!

然而,实际上是黑色 (0,0,0)创建了这个特定的图案:

F75EEBDEFDD7BAF7BF75EEBDEFDD7BAF7B

..或者,当分成 2 x 68 位部分时;

F75EEBDEFDD7BAF7B
F75EEBDEFDD7BAF7B

要查看它的实际效果:

1)在 Photoshop 中创建一个用纯黑色 (0,0,0)填充的 32 像素 x 32 像素图像。

2)选择文件 -> 保存为网络和设备

3)选择JPEG,最大(质量 = 100),模糊 = 0,并且所有渐进/优化/嵌入颜色配置文件/转换为 sRGB 选项 = 关闭,元数据 = 无。

现在,当您在十六进制编辑器中查看图像时,它将显示此 Huffman 编码比特流:

FFDA
000C03010002110311003F00F9FF00FB
F75EEBDEFDD7BAF7B
F75EEBDEFDD7BAF7B
F75EEBDEFDD7BAF7B
F75EEBDEFDD7BAF7B
F75EEBDEFDD7BAF7B
F75EEBDEFDD7BAF7B
F75EEBDEFDD7BAF7B
F75EEBDEFDD7BAF
FFD9

如您所见,它包含8 个 68 位模式的实例。

类似地,如果您改为创建一个 32 像素 x 32 像素的纯白色 (255,255,255)图像(并以与上述相同的方式将其保存为 JPEG),您将获得以下Huffman 编码比特流:

FFDA
000C03010002110311003F00DFE3DFBA
F75EF7EEBDD7BDFBA
F75EF7EEBDD7BDFBA
F75EF7EEBDD7BDFBA
F75EF7EEBDD7BDFBA
F75EF7EEBDD7BDFBA
F75EF7EEBDD7BDFBA
F75EF7EEBDD7BDFBA
F75EF7EEBDD7  F
FFD9

我还尝试创建一个 64 像素 x 64 像素的图像,在中间划分,左侧为32 像素 x 64 像素纯黑色 (0,0,0),右侧为32 像素 x 64 像素纯白色 (255,255,255)。然后保存为质量 = 100 等的 JPEG。然后我得到了这个霍夫曼编码比特流:

FFDA
000C03010002110311003F00F9FF00FB
F75EEBDEFDD7BAF   7B
F75EEBDEFDD7BAFBFC7B
F75EEBDEFDD7BAF   7B
F75EEBDEFDD7BAF803FB
F75EEBDEFDD7BAF   7B
F75EEBDEFDD7BAFBFC7B
F75EEBDEFDD7BAF   7B
F75EEBDEFDD7BAF803FB
F75EEBDEFDD7BAF   7B
F75EEBDEFDD7BAFBFC7B
F75EEBDEFDD7BAF   7B
F75EEBDEFDD7BAF803FB
F75EEBDEFDD7BAF   7B
F75EEBDEFDD7BAFBFC7B
F75EEBDEFDD7BAF   7B
F75EEBDEFDD7BAF803FB
F75EEBDEFDD7BAF   7B
F75EEBDEFDD7BAFBFC7B
F75EEBDEFDD7BAF   7B
F75EEBDEFDD7BAF803FB
F75EEBDEFDD7BAF   7B
F75EEBDEFDD7BAFBFC7B
F75EEBDEFDD7BAF   7B
F75EEBDEFDD7BAF803FB
F75EEBDEFDD7BAF   7B
F75EEBDEFDD7BAFBFC7B
F75EEBDEFDD7BAF   7B
F75EEBDEFDD7BAF803FB
F75EEBDEFDD7BAF   7B
F75EEBDEFDD7BAFBFC7B
F75EEBDEFDD7BAF   7B
F75EEBDEFDD7BA
FFD9

当我发现时,我首先想到的是:“但是,哈夫曼编码不是应该比..这个..!更有效吗? 32 像素 x 32 像素纯色图案中的 8 个相同图案,以及 16 + 8 + 8在 64 像素 x 64 像素半黑/半白的一个中的相同的..?为什么不只使用一个,然后使用指针,比如,在这里,这里,那里和..那里使用这个特定的模式。

然后,我想起了这些 JPEG 实际上非常不寻常的事实,因为它们都是用 Quality = 100 制作的。

因此,Quality = 100 似乎是查看这些 F75E.. 模式所需的另一个因素。

为了验证这一点,我再次制作了 32 像素 x 32 像素的纯黑色 (0,0,0),但现在我使用Quality = 0保存。现在这张图片得到了一个更短的霍夫曼编码比特流,它确实也显示了某种模式,但非常不同:

FFDA
000C03010002110311003F00F99
55540555501
55540555503F
FFD9
于 2014-11-02T20:42:23.197 回答
0

如果我错了,请纠正我,但我认为这可能是检查是否使用了 Photoshop 的一些“蓝图”。也许这一切都与盗版有关

于 2014-11-02T04:22:33.157 回答