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

时间:2015-11-11 07:56:39

标签: image image-processing bitmap file-format

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

我有一个六角形文件,其中应包含三个图像(宽度:640,高度:333)。 hex文件是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

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

以下是magnified version of the original image as gray(图片的原始版本已着色)和obtained image。如您所见,有些像素(每隔一个像素)与原始像素完全不同,但整个图像几乎是正确的。

所以,我的问题如下: hex文件的真正结构是什么?我该如何阅读hex文件? 我怎样才能获得原始彩色文件? 什么是额外的630 KB数据!?什么是错误的像素?!

这里也是原始图像(i.stack.imgur.com/NdBOa.png),原始图像为灰色(i.stack.imgur.com/wDUPB.png)并获得图像(i.stack.imgur.com /lY3ib.png)。

1 个答案:

答案 0 :(得分:1)

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

如果您将十六进制转储文件并查看开头,则会找到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提取图像的基本平面/通道:

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

enter image description here

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

enter image description here

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

enter image description here

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

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

enter image description here

所以现在我有点迷失 - 因为视点似乎移动了,有多个摄像头吗?

我不知道 - 也许我的发现会激励别人!我们来看看。

另一种方法可能是比较统计数据 - 如果你看一下"原始" 图像的统计数据,你会得到这个:

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)

并且"原始"的统计数据之间似乎没有相关性。图像和推定的"频道"提取的图像...我认为这里发生的事情比我猜的要多。