翻訳 98/07/12 y.matsumoto 98/07/26訂正 ●BITMAPFILEHEADER[3.0]  ビットマップ・ファイル情報 BITMAPFILEHEADERデータ構造は、a device-independent bitmap(DIB)ファイルの タイプ、サイズ、レイアウトについての情報を含んでいる。 ---------------------------------------------------------------- typedef struct tag ---------------------------------------------------------------- BITMAPFILEHEADER{ WORD Type; DWORD bfSize; WORD BFRESERVED1; WORD BFRESERVED2; DWORD bfOffBits; }BITMAPFILEHEADER; ---------------------------------------------------------------- (訳者注 : WORD=2bytes DWORD=4bytes) BITMAPFILEHEADERデータ構造は、次のフィールドを含んでいる。 ---------------------------------------------------------------- フィールド    説明 ---------------------------------------------------------------- bfType ファイルタイプ 常に"BM" bfSize ファイルサイズ (bytes) bfReserved1 予約済み  常に"0" bfReserved2 予約済み  常に"0" bfOffBits BITMAPFILEHEADERから実際のビットマップデータまで のオフセット値 ----------------------------------------------------------------- Comments BITMAPINFOまたはBITMAPCOREINFOデータ構造は  BITMAPFILEHEADERのすぐ後に続く。 ●BITMAPINFO[3.0]  DIB情報 BITMAPINFO構造は、Windows3.0のDIBとして、大きさと色の情報について 十分に明示する。 ---------------------------------------------------------------- typedef struct tag ----------------------------------------------------------------    BITMAPINFO{       BITMAPINFOHEADER bmiHeader;       RGBQUAD bmiColors[1]; }BITMAPINFO; ---------------------------------------------------------------- BITMAPINFOの構造には、次のフィールドを含んでいる。 -------------------------------------------------------------------- フィールド     説明 -------------------------------------------------------------------- bmiHeader   BITMAPINFOHEADERデータ構造を明示するもので、DIBの        大きさとカラーフォーマットについての情報を含んでいる。 bmiColors RGBQUADデータ列を明示するもので、ビットマップの色を        定義する。 -------------------------------------------------------------------- Comments: Windows3.0のDIBは、2つの全く異なるパーツから構成されている。 BITMAPINFOデータ構造はビットマップの大きさと色について記述され、 またバイト列(訳者注 : an array of bytes = ピクセルデータ列 ? ) はビットマップのピクセルについて定義する。 それらのビット列は共にパックされているが、長い境界(on a long boundary)では、その終わりに必ず"0"が入れられている。 セグメント境界はビットマップのどこにでも見られるだろう。 ビットマップの始まりは下位左のコーナー(the lower-left corner)である。 (訳者注 ビットマップ画像は、画像の下端から描画される) BITMAPINFOHEADER構造のbiBitCountフィールドは、ビットマップの各々の ピクセルと最大色数を定義するビット数を決定する。 このフィールドには、次の値のどれかがセットされる。 ---------------------------------------------------------------------- 値 意味 ---------------------------------------------------------------------- 1  ビットマップはモノクロで、bmiColorsフィールドには2つのエン      トリを含む。ビットマップ列の各々のビットは一つのピクセルを表現 する。ビットがクリアならば、ピクセルは、bmiColorsのテーブルに おける1番目のエントリの色で表示される。もしビットがセットされ ていれば、ピクセルはテーブルの2番目のエントリの色を帯びる。 ----------------------------------------------------------------------- 4  ビットマップは最大16色の色を持ち、bmiColorsフィールドには、      16までのエントリを含む。      ビットマップの各々のピクセルはカラーテーブルの4ビットのインデ      ックスによって表現される。      例えば、ビットマップの1番目のバイトが 0x1F であれば、この      バイトは 2 ピクセルを表現するが、1番目のピクセルは2番目のテー      ブルエントリによる色を表示し、2番目のピクセルは16番目のテーブル      エントリによる色を表示する。 ------------------------------------------------------------------------ 8 ビットマップは最大256色の色を持ち、bmiColorsフィールドには、      256までのエントリを含む。 この場合、ビットマップ列の一つの バイトは一つのピクセルを表現する。 ------------------------------------------------------------------------ 24 ビットマップは、最大2^24(=1677万)色の色を持つ。      bmiColorsフィールドはヌル(=NULL)で、ビットマップ列の各々の 3バイトはピクセルの赤、緑、青の相対的な強さを表現する。 ------------------------------------------------------------------------ BITMAPINFOHEADER構造のbiClrUsedのフィールドは、実際にビットマップに よって使用されるカラーテーブルの中のカラーインデックスの数を指定する。 もしbiClrUsedのフィールドに "0" がセットされていれば、ビットマップは、 biBitCountフィールドの値による最大色数を使用する。 bmiColorsテーブルの色は、重要さに応じて現れる。 代わりに、DIBを使用するようなファンクションのために、bmiColorsフィー ルドを記号化されていない16ビットの整数の並びとすることもできる。 それらは明白なRGB値の代わりに、最近使われるようになった論理パレット インデックスを明記するものである。このケースでは、アプリケーションは wUsageパラメータをDIB_PAL_COLORSにセットしてから DIB を呼び出して ビットマップを使用する。 Notes: ビットマップがファイルに保存されるか他のアプリケーションへ転送される とき、bmiColorsフィールドはパレットインデックスを含まない。アプリケー ションがビットマップを排他的に使用し、それを完全にコントロールする 場合を除いて、ビットマップのカラーテーブルは、明白なRGB値を含んでい るだろう。 ●BITMAPINFOHEADER[3.0]  DIBフォーマット情報  BITMAPINFOHEADERの構造には、Windows3.0DIBの大きさやカラーフォーマット についての情報を含んでいる。 --------------------------------------------------------- typedef struct tag --------------------------------------------------------- BITMAPINFOHEADER{ DWORD biSize; DWORD biWidth; DWORD biHeight; WORD biPlanes; WORD biBitCount DWORD biCompression; DWORD biSizeImage; DWORD biXPelsPerMeter; DWORD biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; }BITMAPINFOHEADER; --------------------------------------------------------- BITMAPINFOHEADER構造は、次のフィールドを持つ。 ----------------------------------------------------------------- フィールド 説 明 ----------------------------------------------------------------- biSize BITMAPINFOHEADERの構成に必要なバイト数を明記 biWidth ビットマップの幅(pixel) biHeight ビットマップの高さ(pixel) biPlanes 目的とするデバイスのプラン数を明記 常に"1" biBitCount 1ピクセルあたりのビット数          1、4、8、または、24 biCompression 圧縮されたビットマップの圧縮タイプを明記         次の値の1つであるはずだ。      値         意味     BI_RGB (=0)   ビットマップが圧縮されていないことを意味する。     BI_RLE8(=1) 1ピクセルあたり8ビットのRLE(run-length encoding) フォーマットである。           圧縮フォーマットは2バイトで、カウント用の1バイト と、続くカラーインデックスを含む1バイトから構成され ている。詳しくは下記の'Comments'セクションを見なさい。     BI_RLE4(=2) 1ピクセルあたり4ビットのRLEフォーマットである。            圧縮のフォーマットは2バイトで、カウント用の1バイト と、続く2つのカラーインデックスから成る。詳しくは 下記の'Comments'セクションを見なさい。 biSizeImage イメージサイズ(bytes) biXPelsPerMeter 目的とするビットマップの水平解像度(pixel/meter)。 アプリケーションは、現在のデバイスの特質とマッチするリソース         グループの中からビットマップを選択するために、この値を使用できる。 biYPelsPerMeter 目的とするビットマップの垂直解像度(pixel/meter)。 biClrUsed   ビットマップによって実際に使用されているカラーテーブルの中のカラー        インデックスの数を指定する。         この値が0であるときは、ビットマップはbiBitCountフィールドの値に一致        する最大色数を使用する。         カラーテーブルの最大サイズについての詳しい情報は、この章の最初の方の        BITMAPINFOデータ構造の説明を見なさい。         biClrUsedが"0"でなければ、biClrUsedフィールドには実際の色が指定される。 biBitCountフィールドが 24 より少なければグラフィックエンジンかまたは デバイスドライバーのどららかがアクセスするだろう。 biBitCountフィールドに 24 がセットされている場合、biClrUsedのフィールド にはWindowsカラーパレットとして最適化された参照カラーテーブルのサイズが 記述される。 もしこれらのビットマップが 'packed'(圧縮された ?) ビットマップ (それは        BITMAPINFOヘッダのすぐあとに続くビットマップ列の中のビットマップで、単一 ポインタにより参照されたもの ) ならば、biClrUsedフィールドには 0 がセット されるか、または実際のカラーテーブルのサイズがセットされる。 biClrImportant ビットマップの表示のための重要度を考慮したカラーインデックスの数を         指定する。この値が 0 ならば全ての色に影響する。 ---------------------------------------------------------------------------------------- Comments: BITMAPINFOデータ構造は、BITMAPINFOHEADER構造とカラーテーブル ( Windows3.0 DIBの色と大きさの定義を完璧に供給するもの ) を結びつける。Windows3.0DIBに       ついての詳しい情報は、BITMAPINFOデータ構造の記述を見なさい。  BITMAPINFOデータ構造においてカラーテーブルを見つけるために、アプリケーションは biSize フィールドに格納された情報を次のような方法で使用するべきである。     pColor = ((LPSTR) pBitmapInfo + (WORD) (pBitmapInfo -> biSize)) ------------------------------- ●ビットマップの圧縮フォーマット -------------------------------  Windowsがサポートしている圧縮方法には、1ピクセルあたり8ビットで色を定義する方法と、 4ビットの方法がある。圧縮は、ビットマップの格納のために要求されるディスクとメモリを 小さくする。次の節では、これらのフォーマットについて説明する。 biCompressionフィールドに 'BI_RLE8' がセットされる時、ビットマップは「8bit Run-Length Encoding」フォーマットを使用する。このフォーマットは次の2つの方法で圧縮を行う。    7   Encoded   エンコードモード 7 Absolute   アブソリュートモード どちらのモードも、ひとつのビットマップの中のどこにでも見られる。 Encodedモードでは2バイトで構成されている:  最初の1バイトでは連続するピクセルの数を記述し、2番目のバイトにあるカラーインデックス を使って表示される。さらに最初の1バイトにはエスケープを知らせるために 0 をセットするこ とができる。これは「行の終わり」、「ビットマップの終わり」、及び「デルタ(delta)」を表す。  エスケープの解釈は2番目のバイトの値による。次のリストが2バイト目の意味である。   Second Byte of Escape 意味 0 行の終わり          1 ビットマップの終わり。 2 デルタ。続く2バイトの値は、現在の位置から次のピクセルまでの               水平・垂直オフセット値を示す。  Absoluteモードは最初の1バイトに 0 、2バイト目に 03H〜FFH の値がセットされることで知ら される。Absoluteモードでは、2バイト目の値は連続するバイト数を表し、それぞれが単一ピクセル のカラーインデックスを含む。2バイト目の値が 2 かそれ以下にセットされるとき、エスケープは エンコードモードと同じ意味を持つ。Absoluteモードでは1ワード(2bytes)で示される同じ値の 連続が直線的に続く。  次の例は、8ビットで圧縮されたビットマップを16進数で表示したものである。     03 04 05 06 00 03 45 56 67 00 02 78 00 02 05 01     02 78 00 00 09 1E 00 01 このビットマップは、以下のように解凍されるだろう。(2桁の値は一つのピクセルのカラーイン デックスを表す。)       04 04 04     06 06 06 06 06     45 56 67     78 78     現在の位置から右へ 5 、下へ 1 移動     78 78     行の終わり     1E 1E 1E 1E 1E 1E 1E 1E 1E RLEビットマップの終わり biCompressionフィールドに 'BI_RLE4' がセットされるとき、ビットマップは「4bit Run-Length Encoding」フォーマットを使用し、それらはまた Encodedモード と Absoluteモードを使用する。  Encodedモードでは、ペアの最初の1バイトでは連続するピクセルの数を記述し、2番目のバイトに あるカラーインデックスを使って表示される。2番目のバイトには 2つのカラーインデックスを含み、 その一つは上半分(high-order nibble =下位4bits)であり、もう一つは下半分(low-order nibble =上位4bits)である。最初のピクセルは上半分に記述された色で描画され、2番目は下半分、3番目 は上半分というように、1番目のバイトに記述された全てのピクセルについて同じように描画される。  Absoluteモードでは、最初の1バイトに"0"、2番目のバイトには続くカラーインデックスの数が 記述される。そしてそのあとのバイトには、high または low-order nibble 方式によるカラーイン デックスが記述される。一つのカラーインデックスが一つのピクセルである。Absoluteモードでは 1ワード(2bytes)で示される同じ値の連続が直線的に続く。行の終わり、ビットマップの終わり、 およびデルタ脱出は、またBI_RLE4にも適用される。    次の例は、4ビットで圧縮されたビットマップを16進数で表示したものである。     03 04 05 06 00 06 45 56 67 00 04 78 00 02 05 01     04 78 00 00 09 1E 00 01  このビットマップは、以下のよう解凍されるだろう。(1桁の値は一つのピクセルのカラーイン デックスを表す。)     0 4 0     0 6 0 6 0     4 5 5 6 6 7     7 8 7 8     現在の位置から右へ 5 、下へ 1 移動     7 8 7 8     行の終わり     1 E 1 E 1 E 1 E 1     RLEビットマップの終わり ●RGBQUAD[3.0]  RGBカラー構造  RGBQUADデータ構造には、赤、緑、青の相対的な強さが記述される。  BITMAPINFOデータ構造の bmiColorsフィールドは、RGBQUADデータ構造の並びで構成されている。 --------------------------------     typedef struct tag    --------------------------------      RGBQUAD{ BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved; }のRGBQUAD; -------------------------------- RGBQUAD構造には、次のフィールドを含んでいる。 ------------------------------------------ フィールド 説明 ------------------------------------------ rgbBlue 青の強度を記述 rgbGreen 緑の強度を記述 rgbRed    赤の強度を記述  rgbReserved  使用されない。常に "0" ------------------------------------------ ●BITMAPCOREINFO [3.0]  DIB情報   BITMAPCOREINFO構造は、Windows3.0のDIBとして、大きさと色の情報について  十分に明示する。これらは Microsoft OS/2 Presentation Manager ver1.1  及び ver1.2 とコンパチブルである。 ---------------------------------------------------------------- typedef struct tag ----------------------------------------------------------------    BITMAPCOREINFO{       BITMAPCOREHEADER bmciHeader;       RGBTRIPLE bmciColors[1]; }BITMAPCOREINFO; ---------------------------------------------------------------- BITMAPCOREINFOの構造には、次のフィールドを含んでいる。 -------------------------------------------------------------------- フィールド     説明 -------------------------------------------------------------------- bmciHeader   BITMAPCOREHEADERデータ構造を明示するもので、DIBの        大きさとカラーフォーマットについての情報を含んでいる。 bmciColors RGBTRIPLEデータ列を明示するもので、ビットマップの色を        定義する。 -------------------------------------------------------------------- Comments: OS/2 Presentation ManagerのDIBは、2つの全く異なるパーツから構成されている。 BITMAPCOREINFOデータ構造はビットマップの大きさと色について記述され、 またバイト列(訳者注 : an array of bytes = ピクセルデータ列 ? ) はビットマップのピクセルについて定義する。 それらのビット列は共にパックされているが、長い境界(on a long boundary)では、その終わりに必ず"0"が入れられている。 セグメント境界はビットマップのどこにでも見られるだろう。 ビットマップの始まりは下位左のコーナー(the lower-left corner)である。 BITMAPCOREHEADER構造のbcBitCountフィールドは、ビットマップの各々の ピクセルと最大色数を定義するビット数を決定する。 このフィールドには、次の値のどれかがセットされる。 ---------------------------------------------------------------------- 値 意味 ---------------------------------------------------------------------- 1  ビットマップは白黒で、bmciColorsフィールドには2つのエントリを      含む。ビットマップ列の各々のビットは一つのピクセルを表現する。      ビットがクリアならば、ピクセルは、bmciColorsのテーブルにおける      1番目のエントリの色で表示される。      もしビットがセットされていれば、ピクセルはテーブルの2番目の      エントリの色を帯びる。 ----------------------------------------------------------------------- 4  ビットマップは最大16色の色を持ち、bmciColorsフィールドには、      16までのエントリを含む。      ビットマップの各々のピクセルはカラーテーブルの4ビットのインデ      ックスによって表現される。      例えば、ビットマップの1番目のバイトが 0x1F であれば、この      バイトは 2 ピクセルを表現するが、1番目のピクセルは2番目のテー      ブルエントリによる色を表示し、2番目のピクセルは16番目のテーブル      エントリによる色を表示する。 ------------------------------------------------------------------------ 8 ビットマップは最大256色の色を持ち、bmciColorsフィールドには、      256までのエントリを含む。 この場合、データ列の一つのバイトは      一つのピクセルを表現する。 ------------------------------------------------------------------------ 24 ビットマップは、最大2^24(=1677万)色の色を持つ。      bmciColorsフィールドはヌル(=NULL)で、ビットマップ列の各々の 3バイトはピクセルの赤、緑、青の相対的な強さを表現する。 ------------------------------------------------------------------------ bmciColorsテーブルの色は、重要さに応じて現れる。 代わりに、DIBを使用するようなファンクションのために、bmciColors フィールドを記号化されていない16ビットの整数の並びとすることもできる。 それらは明白なRGB値の代わりに、最近使われるようになった論理パレット インデックスを明記するものである。このケースでは、アプリケーションは wUsageパラメータをDIB_PAL_COLORSにセットしてから DIB を呼び出して ビットマップを使用する。 Notes: ビットマップがファイルに保存されるか他のアプリケーションへ転送される とき、bmciColorsフィールドはパレットインデックスを含まない。アプリケー ションがビットマップを排他的に使用し、それを完全にコントロールする 場合を除いて、ビットマップのカラーテーブルは、明白なRGB値を含んでい るだろう。 ●BITMAPCOREHEADER[3.0]  DIBフォーマット情報   BITMAPCOREHEADERの構造には、Windows3.0DIBの大きさやカラーフォーマット  についての情報を含んでいる。これらは Microsoft OS/2 Presentation Manager ver1.1 及び ver1.2 とコンパチブルである。 --------------------------------------------------------- typedef struct tag --------------------------------------------------------- BITMAPCOREHEADER{ DWORD bcSize; WORD bcWidth; WORD bcHeight; WORD bcPlanes; WORD bcBitCount }BITMAPINFOHEADER; --------------------------------------------------------- BITMAPCOREHEADER構造は、次のフィールドを持つ。 ----------------------------------------------------------------- フィールド 説 明 ----------------------------------------------------------------- bcSize BITMAPCOREHEADERの構成に必要なバイト数を明記 bcWidth ビットマップの幅(pixel) bcHeight ピクセルの高さ(pixel) bcPlanes 目的とするデバイスのプラン数を明記 常に"1" bcBitCount 1ピクセルあたりのビット数          1、4、8、または、24 ----------------------------------------------------------------- Comments: BITMAPCOREINFOデータ構造は、BITMAPCOREHEADER構造とカラーテーブル ( Windows3.0DIBの色と大きさの定義を完璧に供給するもの ) を結びつける。 DIBについての詳しい情報は、BITMAPCOREINFOデータ構造の記述を見なさい。  BITMAPCOREINFOデータ構造においてカラーテーブルを見つけるために、アプリケーション は bcSizeフィールドに格納された情報を次のような方法で使用するべきである。     pColor = ((LPSTR) pBitmapCoreInfo + (WORD) (pBitmapCoreInfo -> bcSize)) ●RGBTRIPLE[3.0] RGBカラー構造  RGBTRIPLEデータ構造には、赤、緑、青の相対的な強さが記述される。  BITMAPCOREINFOデータ構造の bmciColorsフィールドは、RGBTRIPLEデータ構造の並びで 構成されている。 --------------------------------     typedef  struct tag    --------------------------------      RGBTRIPLE{ BYTE rgbtBlue; BYTE rgbtGreen; BYTE rgbtRed; }のRGBTRIPLE; -------------------------------- RGBTRIPLE構造には、次のフィールドを含んでいる。 ------------------------------------------ フィールド 説明 ------------------------------------------ rgbtBlue 青の強度を記述 rgbtGreen 緑の強度を記述 rgbtRed    赤の強度を記述  ------------------------------------------ ---------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------     非公式コメント  BMPのファイルを読む時、どのようにBITMAPINFOとBITMAPCOREINFOを区別するか。  BITMAPFILEHEADERを読んだあと、ファイルから次のDWORD(=4bytes)を読みなさい。 もしそれが 12 ならば、あなたが読んでいるのは BITMAPCOREHEADER であり、それが 40 ならば、 あなたが読んでいるのは BITMAPINFOHEADER である。 ----------------------------------------------------------------------------------------