BMPファイル構造

2396 ワード

BMPファイル構造
BMPファイル構造
----1.BMPファイル構成
----BMPファイルはファイルヘッダ、ビットマップ情報ヘッダ、カラー情報、グラフィックデータの4つの部分から構成されています.
----2.BMPファイルヘッダ
----BMPファイルヘッダデータ構造には、BMPファイルの種類、ファイルサイズ、ビットマップの開始位置などの情報が含まれています.
----その構造定義は以下の通りである.
typedef struct tagBITMAPFILEHEADER
{
WORDbfType;   //        ,   BM
DWORD   bfSize;   //        ,      
WORDbfReserved1;  //        ,   0
WORDbfReserved2;  //        ,   0
DWORD   bfOffBits; //          ,      
//          ,      
} BITMAPFILEHEADER;
----3.ビットマップヘッダ
BMP                   。
typedef struct tagBITMAPINFOHEADER{
   DWORD  biSize;   //          
   LONGbiWidth;  //      ,      
   LONGbiHeight; //      ,      
   WORD   biPlanes; //        ,   1
   WORD   biBitCount//          ,   1(  ),
  // 4(16 ),8(256 ) 24(   )  
   DWORD  biCompression;   //       ,    0(   ),
  // 1(BI_RLE8    ) 2(BI_RLE4    )  
   DWORD  biSizeImage; //      ,      
   LONGbiXPelsPerMeter; //        ,     
   LONGbiYPelsPerMeter;  //        ,     
   DWORD  biClrUsed;//                
   DWORD  biClrImportant;//              
} BITMAPINFOHEADER;
----4.カラーテーブル
ーーカラーテーブルはビットマップの色を説明するために使用され、いくつかのテーブル項目があり、各テーブル項目はRGBQUADタイプの構造であり、色を定義します.RGBQUAD構造の定義は以下の通りです.
typedef struct tagRGBQUAD {
BYTErgbBlue;//      (    0-255)
BYTErgbGreen;   //      (    0-255)
BYTErgbRed; //      (    0-255)
BYTErgbReserved;//   ,   0
} RGBQUAD;
    RGBQUAD        biBitCount   :
 biBitCount=1,4,8 ,   2,16,256   ;
 biBitCount=24 ,      。
                  ,BITMAPINFO      :
typedef struct tagBITMAPINFO {
   BITMAPINFOHEADER bmiHeader;   //      
   RGBQUAD  bmiColors[1];  //    
} BITMAPINFO;
----5.ビットマップデータ
----ビットマップデータはビットマップの各ピクセル値を記録しています.記録順序はスキャン行の中で左から右、スキャン行の間で下から上までです.ビットマップのピクセル値のバイト数:
 biBitCount=1 ,8    1   ;
 biBitCount=4 ,2    1   ;
 biBitCount=8 ,1    1   ;
 biBitCount=24 ,1    3   ;
Windowsではスキャン行のバイト数は4の倍数(つまりlong単位)でなければならないと規定されています.足りないのは0で満たされています.
スキャン行のバイト数計算方法:DataSizePerLine=(biWidth*BiBitCount+31)/8;
//走査行のバイト数DataSizePerLine=DataSizePerLine/4*4バイト数は4の倍数でなければなりません.
ビットマップデータのサイズ(非圧縮の場合):DataSize=DataSizePerLine*biHeight;