在做一個顯示bmp圖片到lcd屏的時候,發現有些bmp圖顯示不對.
同樣是16bit bmp卻有差異.
就查了一下格式.
bmp文件格式
| 位圖文件的組成 |
結構名稱 |
符號 |
| 位圖文件頭(bitmap-file header) |
BITMAPFILEHEADER |
bmfh |
| 位圖信息頭(bitmap-information header) |
BITMAPINFOHEADER |
bmih |
| 彩色表(color table) |
RGBQUAD |
aColors[] |
| 圖像數據陣列字節 |
BYTE |
aBitmapBits[] |
| 偏移量 |
域的名稱 |
大小 |
內容 |
|
|
圖像文件 頭 |
0000h |
標識符(Identifier) |
2 bytes |
兩字節的內容用來識別位圖的類型: ‘BM’ : Windows 3.1x, 95, NT, … ‘BA’ :OS/2 Bitmap Array ‘CI’ :OS/2 Color Icon ‘CP’ :OS/2 Color Pointer ‘IC’ : OS/2 Icon ‘PT’ :OS/2 Pointer |
| 0002h |
File Size |
1 dword |
用字節表示的整個文件的大小 |
|
| 0006h |
Reserved |
1 dword |
保留,設置為0 |
|
| 000Ah |
Bitmap Data Offset |
1 dword |
從文件開始到位圖數據開始之間的數據(bitmap data)之間的偏移量 |
|
| 000Eh |
Bitmap Header Size |
1 dword |
位圖信息頭(Bitmap Info Header)的長度,用來描述位圖的顏色、壓縮方法等。下面的長度表示: 28h - Windows 3.1x, 95, NT, … 0Ch - OS/2 1.x F0h - OS/2 2.x |
|
| 0012h |
Width |
1 dword |
位圖的寬度,以像素為單位 |
|
| 0016h |
Height |
1 dword |
位圖的高度,以像素為單位 |
|
| 001Ah |
Planes |
1 word |
位圖的位面數 |
|
| 圖像 信息 頭
|
001Ch |
Bits Per Pixel |
1 word |
每個像素的位數 1 - Monochrome bitmap 4 - 16 color bitmap 8 - 256 color bitmap 16 - 16bit (high color) bitmap 24 - 24bit (true color) bitmap 32 - 32bit (true color) bitmap |
| 001Eh |
Compression |
1 dword |
壓縮說明: 0 - none (也使用BI_RGB表示) 1 - RLE 8-bit / pixel (也使用BI_RLE4表示) 2 - RLE 4-bit / pixel (也使用BI_RLE8表示) 3 - Bitfields (也使用BI_BITFIELDS表示) |
|
| 0022h |
Bitmap Data Size |
1 dword |
用字節數表示的位圖數據的大小。該數必須是4的倍數 |
|
| 0026h |
HResolution |
1 dword |
用像素/米表示的水平分辨率 |
|
| 002Ah |
VResolution |
1 dword |
用像素/米表示的垂直分辨率 |
|
| 002Eh |
Colors |
1 dword |
位圖使用的顏色數。如8-位/像素表示為100h或者 256. |
|
| 0032h |
Important Colors |
1 dword |
指定重要的顏色數。當該域的值等於顏色數時,表示所有顏色都一樣重要 |
|
| 調色板數據 |
0036h |
Palette |
N * 4 byte |
調色板規范。對於調色板中的每個表項,這4個字節用下述方法來描述RGB的值:
|
| 圖像數據 |
0436h |
Bitmap Data |
x bytes |
該域的大小取決於壓縮方法,它包含所有的位圖數據字節,這些數據實際就是彩色調色板的索引號 |
后來打印了一下頭信息的各個值發現,壓縮方式不一樣
Compression =0 或
Compression=3.
Compression=0時 rgb565使用3個字節即,R、G、B各占1個字節,共3個字節。
而
Compression=3時R、G、B總共占2個字節。 調色板數據會存儲三個掩碼。 RGB565,這三個值是0xF800、0x07E0、0x001F。
即取出2個字節的圖像數據與上0xF800就是R
其他壓縮方式較復雜,沒有使用到。
