2013-05-05 66 views
4

下面以理解的位圖像素是位圖中的十六進制數據試圖通過像素

424D 46000000 0000 0000 3e000000 28000000 02000000 02000000 0100 0100 00000000 08000000 00000000 00000000 00000000 00000000 0000 0000 FFFF FF00 C000 0000 0000 0000

我需要了解所有的值代表什麼,最明確的是像素值。這是一個用mspaint保存的位圖,它是一個單色位圖。以下是我的理解/誤解......其中大部分信息來自wiki和search bmp。這只是我試圖分解我的bmp,​​它有兩個黑色像素在頂部和兩個白色像素在底部。

42 4d  is BM 
46 00 00 00 size of entire file 
00 00  reserved 1 
00 00  reserved 2 
3e 00 00 00 offset to where pixel data can be found 

28 00 00 00 # of bytes in this header 
02 00 00 00 width of bmp 
02 00 00 00 height of bmp 
01 00  # of planes 
01 00  # of bits per pixel 
00 00 00 00 compression 
08 00 00 00 size of raw data in pixel array in bytes 
00 00 00 00 horizontal resolution pix/m 
00 00 00 00 vertical resolution pix/m 
00 00 00 00 number of colors 
00 00 00 00 important colors 
00 00 00 00 x=1 y=2 pixel value? is supposed to be white 
ff ff ff 00 x=2 y=2 pixel value? is supposed to be white 
c0 00 00 00 x=1 y=1 pixel value? is supposed to be black 
00 00 00 00 x=2 y=1 pixel value? is supposed to be black 

最後的像素值是真正令人困惑我不明白他們怎麼會等於什麼,他們都應該等於加我想RGB或BGR的數據只有3個字節?此外,像素數據可以找到的偏移距離位圖中最後一個字節的2個字節......我覺得我正在對它進行完全錯誤的解碼。

+0

數據似乎與您的實際位圖不匹配。你有8個字節的數據,但你肯定會顯示16個字節。並且每個像素的位數應該是1?我在這裏有點困惑。字節數與您的第一個數字0x46匹配。所有這些來自一個位圖嗎? – 2013-05-05 19:05:29

+0

而且,是否可以將BMP文件上傳到網上某處,以便我們查看它? – 2013-05-05 19:06:19

回答

9
00 00 00 00 
ff ff ff 00 

這些字節是調色板。由於每像素的位數設置爲1,因此調色板中只能有兩種顏色。第一種顏色是黑色(00 00 00 00),第二種是白色(ff ff ff 00)。每種顏色的最後一個字節只是填充符,並且始終設置爲00

c0 00 00 00 
00 00 00 00 

這是實際的像素數據。必須將每行像素填充到可包含數據的最近4個字節。所以在這裏,第一行是像素的底部行,第二行是像素的第一行(因爲BMP像素順序是自下而上的)。由於我們每像素使用1位,因此我們應該在字節級別查看它。具體地,像素的第一行由下式給出:

1100 0000 0000 0000 0000 0000 0000 0000 

由於我們只有像素的每一行中的兩個像素和每像素僅1比特,僅前兩個比特無關緊要。在這種情況下,11指定前兩個像素是調色板中的第二種顏色(1)。現在,第二行,我們有:

0000 0000 0000 0000 0000 0000 0000 0000 

,並再次,我們只需要看看前兩個像素,00。這意味着下一個像素是調色板中的第一個顏色(0)。

+2

另外值得注意的是:BMP像素順序是自下而上,從左到右。所以前兩位對底部白色像素進行編碼,接下來的兩位對上部黑色像素進行編碼。 – leemes 2013-05-05 19:13:51

+0

好吧,這意味着更多的意義,所以其他00 00 00 00 00 00字節到底怎麼樣..他們是什麼? – itb 2013-05-05 19:17:04

+1

@itb:可能的填充。如果我記得正確,BMP指定填充爲每行4個字節的對齊方式。 2行=最小4 * 2 = 8個字節。 – leander 2013-05-05 19:44:15

3

c0 00 00 00

該塊的最後3個字節是用於填充

填充字節(不一定0)以彈出的長度必須被附加到行的結束行爲四個字節的倍數。當像素陣列被加載到內存中時,每一行必須從4的倍數的內存地址開始。

+0

謝謝我覺得維基應該舉幾個例子:) – itb 2013-05-05 19:55:26