Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 如何解释1 bpp BMP文件中的像素阵列_Image_Image Processing_Graphics_Bmp_Raster Graphics - Fatal编程技术网

Image 如何解释1 bpp BMP文件中的像素阵列

Image 如何解释1 bpp BMP文件中的像素阵列,image,image-processing,graphics,bmp,raster-graphics,Image,Image Processing,Graphics,Bmp,Raster Graphics,在以下情况下,我无法找到解释像素阵列的方法: 我在Windows7上用MS Paint创建了一个2x2像素的BMP图像。将其保存为单色BMP(我认为这意味着BMP的颜色深度为每像素1位) 这是图像缩放时的外观(黑色像素、白色像素、白色像素、黑色像素) 然后,我用十六进制编辑器打开bmp,可以看到以下信息: 00: 424d 4600 0000 0000 0000 3e00 0000 2800 BMF.......>...(. 10: 0000 0200 0000 0200 0000 0

在以下情况下,我无法找到解释像素阵列的方法: 我在Windows7上用MS Paint创建了一个2x2像素的BMP图像。将其保存为单色BMP(我认为这意味着BMP的颜色深度为每像素1位)

这是图像缩放时的外观(黑色像素、白色像素、白色像素、黑色像素)

然后,我用十六进制编辑器打开bmp,可以看到以下信息:

00: 424d 4600 0000 0000 0000 3e00 0000 2800  BMF.......>...(.
10: 0000 0200 0000 0200 0000 0100 0100 0000  ................
20: 0000 0800 0000 0000 0000 0000 0000 0000  ................
30: 0000 0000 0000 0000 0000 3f3f 3f00 3f00  ..........???.?.
40: 0000 4000 0000 0a                        ..@....
据我在维基百科上读到的关于BMP格式()的文章,这部分是像素阵列:

3f00 0000 4000 0000


像素阵列中的值的含义是什么?3F值有特殊含义吗?

您发布的十六进制转储与您发布的图像不完全对应。以下是我得到的:

00000000 42 4D 46 00 00 00 00 00 00 00 3E 00 00 00 28 00 BMF.......>...(.
00000010 00 00 02 00 00 00 02 00 00 00 01 00 01 00 00 00 ................
00000020 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00000030 00 00 00 00 00 00 00 00 00 00 FF FF FF 00 80 00 ................
00000040 00 00 40 00 00 00                               ..@...
颜色表从0x36开始。那里有两个RGBquad。第一个0x00000000对应于黑色。下一个0x00FFFFFF对应于白色

像素数据在此之后开始。每个像素由一个位表示。尽管图像的每一行只需要两位,但每一行都与一个四字节的边界对齐。因此,第一行是0x8000000,第二行是0x40000000。很可能有些应用程序可能懒得清除填充位

行数据逐字节解释,从每个字节的最高有效位到最低有效位

0x8的高位是1和0,我们应该看到颜色1(白色)后跟颜色0(黑色),在最下面的一行中按顺序排列。其余的位将被忽略,因为它们将对应于宽度超过2的像素,接下来的三个字节的存在只是为了确保后续行与4字节边界对齐

0x4的高位是0和1,因此我们应该看到颜色0(黑色)后面跟着颜色1(白色),在上一行的顺序是这样的。和以前一样,其余的位被忽略

在十六进制转储中,颜色表为黑色(0x00000000)和灰色(0x003F3F)。没什么大不了的。像素数据在第一(底部)行上具有高位0和0,在第二(顶部)行上具有高位0和1。其他位是用于填充的随机垃圾


(0x3F与灰度值相似的事实表明编码器可能没有清除写入颜色表后重复使用的变量或寄存器。)

你好,Adrian,感谢您的解释。这很有道理。奇怪的是,我试着在Windows7上用PhotoshopCS6和MS Paint创建相同的BMP文件,得到了上面粘贴的结果。您用来创建自己的程序是什么?我在Windows 7上使用了MS Paint。好的,找到了问题。我使用vim和xxd检查BMP文件的十六进制。当我没有通过“vim-b pic.BMP”读取vim中二进制的BMP文件时,就会出现这种奇怪的状态,因此问题在于通过vim显示十六进制,而不是文件本身。再次感谢你的帮助。