在做一個顯示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
其他壓縮方式較復雜,沒有使用到。
