Bitmap BITMAPFILEHEADER BITMAPINFOHEADER

5770 ワード

BMPフルネームBitmap(ビットマップ)は、ピクチャフォーマットです.フォーマットとは、BMPピクチャ、すなわちデータがBMPフォーマットの規定に従ってデータを格納、読み取り、転送する約束または規定である.
例を挙げると、テスト図(クリックするとリンクアドレス、画像が海外に来たテスト画像ライブラリ)
MD5:B4CA8C9BF43BDBED60132560027AB020
SHA-1:5FDB1AB7DB087B5238D85C5C1A9E333BE2DDE211
ex:テスト図のデータを分析する
上図左上から、このテスト図は、1、ファイルヘッダ、2、情報ヘッダ、3、画像データの3つの部分から構成されている.
1、ファイルヘッダBITMAPFILEHEADER---C++code
	

[cpp] view plain copy print ?
typedef struct tagBITMAPFILEHEADER {/* bmfh */  
  •       

  •     WORD  bfType;//ファイルタイプ、0 x 4 D 42、ASCIIテーブル、すなわち文字'BM'を調べる
  •     DWORD bfSize;//ファイルサイズ、0 xb 6631200--バイト順0 x 01263 b 6のため、10進数は1205174
  • である
        WORD  bfReserved1;//保留、デフォルトは0
  •     WORD  bfReserved2;//保留、デフォルトは0
  •     DWORD bfOffBits;/**ファイルヘッダから実際の画像データまでのバイトのオフセット量を説明します. 
  • *このパラメータは非常に有用であり、ビットマップ情報ヘッドとパレットの長さは状況によって異なるため、
  • を用いることができる.
    *このオフセット値は、ファイルから所定のデータをすばやく読み込みます.0 x 0036説明画像データは、上図のイエローベースの後の部分**/である
  •       

  • } BITMAPFILEHEADER, *PBITMAPFILEHEADER;  
    	typedef struct tagBITMAPFILEHEADER {/* bmfh */
    		
    		WORD  bfType;			//    ,0x4D42, ASCII    'BM'
    		DWORD bfSize;			//    ,0xb6631200--      0x001263b6,     1205174
    		WORD  bfReserved1;		//  ,   0
    		WORD  bfReserved2;		//  ,   0
    		DWORD bfOffBits;		/**                         。
    		*       ,                        ,     
    		*                  。0x0036                  **/
    		
    	} BITMAPFILEHEADER, *PBITMAPFILEHEADER;

    2、情報ヘッダBITMAPINFOHEADER---C++code
    [cpp] view plain copy print ?
    typedef struct tagBITMAPINFOHEADER { /* bmih */  
  •     DWORD biSize;//BITMAPINFOHEADER構造に必要なバイト数0 x 0000028、すなわち0 x 28バイト
  •     LONG biWidth;//画像幅、画素単位0 x 000002 ea、すなわち746画素
  •     LONG biHeight;/**イメージの高さは、ピクセル単位です.注:この値は、画像を記述するための高さを除いて
  • です.
    *画像が逆方向のビットマップであるか、正方向のビットマップであるかを示す別の用途があります.値が正数である場合、
  • *画像は逆方向であり、値が負の場合、画像が順方向であることを示します.ほとんどのBMPファイルは逆方向のビットマップで、
  • もあります.
    *は、高さの値が正の値です.0 x 000021 a、すなわち538画素**/
  •     WORD biPlanes;//説明対象機器のビット数
  •     WORD biBitCount;//ビット数/画素、0 x 0018、すなわち24
  •     DWORD biCompression;//画像データ圧縮タイプ、0 x 00000000、圧縮がないことを示す
  •     DWORD biSizeImage;//画像データサイズ、0 x 0126380、すなわち1205120
  •     LONG biXPelsPerMeter;//水平解像度、画素/m、0 x 0000000
  •     LONG biYPelsPerMeter;//垂直解像度、画素/m、0 x 00000000
  •     DWORD biClrUsed;//ビットマップで実際に使用しているカラーテーブルのカラーインデックス数(0に設定すると、すべてのパレットアイテムを使用することを示します).
  •     DWORD biClrImportant;//画像に重要な影響を及ぼす色インデックスの数は、0であればいずれも重要です.  
  • } BITMAPINFOHEADER;  
  • 	typedef struct tagBITMAPINFOHEADER { /* bmih */
    		DWORD biSize;			//BITMAPINFOHEADER          0x00000028, 0x28   
    		LONG biWidth;			//    ,      0x000002ea, 746   
    		LONG biHeight;			/**    ,      。 :                
    		*        ,             ,       。         ,  
    		*      ,         ,         。    BMP         , 
    		*   ,        。0x0000021a, 538   **/
    		WORD biPlanes;			//          
    		WORD biBitCount;        //   /  ,0x0018, 24
    		DWORD biCompression;	//         ,0x00000000,      
    		DWORD biSizeImage;		//      ,0x00126380, 1205120
    		LONG biXPelsPerMeter;	//     ,   / ,0x00000000
    		LONG biYPelsPerMeter;	//     ,   / ,0x00000000
    		DWORD biClrUsed;		//                 (  0  ,           )。
    		DWORD biClrImportant;	//                  ,   0,     。
    	} BITMAPINFOHEADER;

     
    注:ファイルサイズ0 x 001,263 b 6=オフセット0 x 0036+画像データサイズ0 x 001,26380
    ブロック名
    Windows構造体定義に対応
    サイズ(Byte)
    ファイルヘッダ
    BITMAPFILEHEADER
    14
    ビットマップヘッダ
    BITMAPINFOHEADER
    40
    RGBカラー配列
    BYTE*
    画像の長さと幅の寸法によって決まる
    オフセット量0 x 0036は、ファイル情報ヘッダ14+ビットマップ情報ヘッダ40、すなわち54バイトである
    3、画像データ
    2の緑色で表示された24ビットのRGBビット画素データは、実際の読み出し形式である.
    青色B値
    緑色G値
    赤色R値
    画像データ部のデータは、画像左下隅からスキャンされる.
    ================================================
    4、補足:
    完全なBMP構造:1、ファイル情報ヘッド、2、ビットマップ情報ヘッド、3、カラーテーブル、4、ビットマップデータアレイ
    ビットマップ情報ヘッダのbiBitCountには、次のような値があります.
    BiBitCount=1は、ビットマップが最大2色あることを示し、デフォルトでは黒と白です.BiBitCount=4は、ビットマップが最大16色あることを示しています.各画素は4ビットで表され、この4ビットをカラーテーブルのテーブル項目としてその画素の色を検索する.BiBitCount=8は、ビットマップが最大256色あることを示しています.各画素は8ビットで表され、この8ビットをカラーテーブルのテーブル項目として画素の色を検索する.BiBitCount=16は、ビットマップが最大65536色であることを示しています.各色素用16ビット(2バイト)で表します.この形式は高カラー、またはエンハンスメント16ビットカラー、または64 Kカラーと呼ばれます.biCompressionメンバーの値がBI_RGBの場合、パレットはありません.16ビットのうち、最も低い5ビットは青色成分、中間の5ビットは緑色成分、高い5ビットは赤色成分で、合計15ビットを占め、最も高い1ビットは保持され、0に設定されます.このフォーマットは555 16ビットビットマップとも呼ばれる.biCompressionメンバーの値がBI_の場合BITFILDSでは、まず、赤、緑、青マスクと呼ばれる3つのDWORD変数によって元のパレットの位置が占められています.赤、緑、青の成分が16ビットに占める位置をそれぞれ記述するために使用される.Windows 95(または98)では、システムは2つのフォーマットのビットドメイン:555と565を受け入れることができ、555フォーマットでは、赤、緑、青のマスクはそれぞれ:0 x 7 C 00、0 x 03 E 0、0 x 001 Fであり、565フォーマットでは、それぞれ:0 xF 800、0 x 07 E 0、0 x 001 Fである.1つのピクセルを読み取った後、それぞれマスク「と」上のピクセル値を用いて、所望の色成分を抽出することができる(もちろん、適切な左右シフト操作も必要です).NTシステムでは、フォーマット制限はありませんが、マスクの間に重複がないことが要求されます.(注:この形式の画像は使用するのは面倒ですが、その表示効果は本物に近いため、画像データは本物よりもずっと小さいので、ゲームソフトに多く使われています).biBitCount=24はビットマップが最大1670万色あることを示しています.このビットマップにはパレットはありません(bmiColorsメンバーサイズは0)ビット配列では、3バイトごとに1つの画素を表し、それぞれ色R、G、Bに対応する.biBitCount=32はビットマップが最大4294967296であることを示す(2の32乗)種の色.このビットマップの構造は16ビットビットマップ構造と非常に類似しており、biCompressionメンバーの値がBI_RGBである場合、パレットもなく、32ビットのうち24ビットがRGB値を格納するために用いられ、順序は、最上位-保留、赤8ビット、緑8ビット、青8ビットである.このフォーマットも888 32ビットマップとなる.biCompressionメンバーの値がBI_BITFILDSである場合、元々パレットの位置は3つのDWORD変数で占められ、赤、緑、青マスクとなり、それぞれ赤、緑、青成分が32ビットに占める位置を記述するために使用される.Windows 95(or 98)では、システムは888形式しか受け付けていません.つまり、3つのマスクの値は、0 xFF 0000、0 xFF 00、0 xFFとなります.NTシステムでは、マスクの間に重複が生じないように注意すればいいのです.(注:この画像フォーマットは、DWORDで整列しているので、メモリで画像処理を行う際にアセンブリレベルのコード最適化が可能です簡単です.
    ≪行揃え|Row Align|emdw≫:Windowsでは、1つのスキャン行に占めるバイト数を4の倍数で指定し、不足している場合は0で入力します.スキャン行のバイト数の計算方法:DataSizePerLine=(biWidth*biBitCount+31)/8
    以上の内容は参考にしてください.もっと詳しい内容はgoogle検索と参考文献を参照してください.