16位位图hex文件的文件格式是什么?

What is the file format of the 16bit bitmap hex file?

我是这个领域的新手;如果我没有很好地描述问题,请原谅。

我有一个 hex 文件,它应该包含三个图像(宽度:640,高度:333)。十六进制文件为 1.2 MB。所以如果我们稍微计算一下,我们得到每个像素应该有16位数据。

该文件的部分十六进制代码如下:

90 eb 6f 14 02 02 fd fd 4e 01 80 02 00 00 00 00
90 eb 6f 14 82 82 7d 7d 4e 01 80 02 03 00 00 00
90 eb 6f 14 c2 c2 3d 3d 4e 01 80 02 00 00 8e 08
a7 33 0f d4 00 01 00 01 00 01 43 01 f8 03 0e 17
00 01 00 00 00 00 02 00 00 00 00 00 00 00 01 00
00 04 00 00 01 01 00 00 00 00 00 00 00 00 00 00
00 00 01 01 00 00 00 00 00 01 00 00 00 00 00 00
00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00
00 00 00 00 00 00 00 01 00 00 00 00 00 00 01 01
00 00 00 00 01 00 00 00 00 00 00 00 00 00 01 01
00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00
00 01 00 00 08 01 00 00 00 00 00 00 00 00 00 00
00 01 00 00 00 00 00 01 00 00 00 00 00 0a 01 00
00 00 01 00 01 00 00 00 01 00 00 00 00 00 00 00
02 00 00 01 00 00 00 01 00 00 00 00 00 00 00 01

如您所见,有一个 header 包含 4 行内容,其中 3 行内容相似。位图数据开始。重复行在文件中又重复了两次。所以我假设重复结构位于 3 个图像中的每一个的开头。但是这些 header 之间的数据是 210 KB,这意味着每个像素 8 位。所以我将每 8 位读取为一个小整数,并将其设置为图像相应像素的 rgb。所以我得到了3张灰度图像。文件中还有 630 KB 的数据未读。

这里是magnified version of the original image as gray (original version of the picture is colored) and obtained image。如您所见,有些像素(每隔一个像素)与原始像素完全不同,但整个图像几乎是正确的。

所以,我的问题如下: hex文件的真实结构是什么?我应该如何读取十六进制文件? 如何获得原始彩色文件? 额外的 630 KB 数据是什么!?什么是错误的像素?!

这里也是原图(i.stack.imgur.com/NdBOa.png),原图为灰度(i.stack.imgur.com/wDUPB.png),得到的图像(i.stack.imgur.com/lY3ib.png).

没有定论,但这是我发现的...

如果你对文件进行十六进制转储并查看开头,你会找到 90eb 如果你在整个文件中查找它,你会得到:

xxd a.raw | egrep "90eb"

0000000: 90eb 6f14 0202 fdfd 4e01 8002 0000 0000  ..o.....N.......
0000010: 90eb 6f14 8282 7d7d 4e01 8002 0300 0000  ..o...}}N.......
0000020: 90eb 6f14 c2c2 3d3d 4e01 8002 0000 8e08  ..o...==N.......
0034340: e773 2bf4 90eb 6f14 c2c2 3d3d 4e01 8002  .s+...o...==N...
0068660: 0301 0100 ca03 0104 90eb 6f14 c2c2 3d3d  ..........o...==

数据看起来在每个 90eb 之后开始 32 个字节。如果图片为 640x333,则每张图片将有 213,120 字节。所以我们可以用ImageMagick像这样提取图像的基本planes/channels:

dd if=a.raw bs=1 skip=64 count=213120 | convert -depth 8 -size 640x333 gray:- a.png

dd if=a.raw bs=1 skip=213860 count=213120 | convert -depth 8 -size 640x333 gray:- b.png

dd if=a.raw bs=1 skip=427656 count=213120 | convert -depth 8 -size 640x333 gray:- c.png

现在我们遇到了一个问题 - 各个图像在所有三幅图像中的位置都不相同 - 你可以看到,如果我像这样将 3 帧一起制作动画:

convert -delay 80 a.png b.png c.png -normalize  anim.gif

所以现在我有点迷茫了——因为视点似乎在移动,是否有多个摄像机?

我不知道 - 也许我的发现会启发其他人!让我们看看。

另一种方法可能是比较统计数据 - 如果您查看 "original" 图像的统计数据,您会得到:

identify -verbose original.png | egrep "Red:|Green:|Blue:|mean:|deviation"
    Red:
      mean: 5.77718 (0.0226556)
      standard deviation: 17.0501 (0.066863)
    Green:
      mean: 13.7015 (0.0537312)
      standard deviation: 38.4053 (0.150609)
    Blue:
      mean: 10.2863 (0.0403386)
      standard deviation: 30.1792 (0.11835)

如果您现在查看上面提取的 a.pngb.pngc.png 的统计信息,您会得到:

identify -verbose a.png | egrep "Red:|Green:|Blue:|Gray:|mean:|deviation"
    Gray:
      mean: 2.48532 (0.00974635)
      standard deviation: 9.00678 (0.0353207)

identify -verbose b.png | egrep "Red:|Green:|Blue:|Gray:|mean:|deviation"
    Gray:
      mean: 10.1611 (0.0398473)
      standard deviation: 30.2288 (0.118544)


identify -verbose c.png | egrep "Red:|Green:|Blue:|Gray:|mean:|deviation"
    Gray:
      mean: 2.26135 (0.00886804)
      standard deviation: 7.43093 (0.0291409)

并且 "original" 图像的统计数据与提取图像的推定 "channels" 之间似乎没有任何相关性......我认为这里发生的事情比我能猜到。