8.42023
6.BMPファイルの画像データについて[24bitBMP]
こんにちは、カルチスタッフです。
前回に引き続き、Windowsで標準的に使われる画像ファイルである、ビットマップファイルについて説明します。
まず、BMPファイルの構成についておさらいしていきたいと思います。BMPファイルは、次の4つの領域で構成されています。
①ファイルヘッダ
②情報ヘッダ
③カラーパレット
④画像データ
BMPファイルは汎用性があるフォーマットですが、ここでは、カルチで使用するBMPファイルのフォーマットに限定して説明します。
BMPファイルは、【④画像データ】の形式によってフォーマットが異なるため、【④画像データ】の種類毎に説明を進めたいと思います。
カルチで扱う【④画像データ】の形式は、大きく分けて5種類あります。これは、【②情報ヘッダ】の【ビットカウント】の種類によって分けられます。【ビットカウント】は1ドットを表現するために使用するデータサイズを格納します。
つまり、使用する色数を表します。
ビットカウントの値 | 1ドットを表す値の範囲 | 色数 |
1 | 0x00~0x01 | 2色 |
4 | 0x00~0x0F | 16色 |
8 | 0x00~0xFF | 256色 |
24 | 0x000000~0xFFFFFF | 1677万色 |
32 | 0x00000000~0xFFFFFF00 | 1677万色 |
前回は、ビットカウントが8の場合のフォーマットについて説明しました。
今回は、ビットカウントが24の場合と、32の場合について、1文字1ファイルのフォントファイルを例にして、BMPフォーマットを説明したいと思います。
例として、前回同様、16x16の「永」の文字をBMPファイルフォーマットで表すことを考えます。
Unicodeは0x6C38です。
Windowsの標準アプリ「フォト」でbmpを見てみるとこのようになります。
アプリで開いた状態は、ビットカウントが1の場合、4の場合と変わりません。
まず始めに、イメージを持ちやすいよう、BMPファイルの4つの構成のうちの【④画像データ】から説明します。
ビットカウントが24の場合、1ドットを表すのに使用できる領域は3byteです。
ビットカウントが32の場合、1ドットを表すのに使用できる領域は4byteです。
使用できる値は、ビットカウント24の場合、ビットカウント32の場合どちらも、0~16777214までの16777215個です。ビットカウントが32の場合、フォーマット上は、1ドットを表すのに4byteの領域を使用できますが、最下位の1byteは予約領域となっていて、実際には使用しません。そのため、ビットカウント32とビットカウント24の使用できる値が同じになっています。
画像データを指定する時のポイントを示します。
- カラーパレットはありません。
ビットカウント24の場合、画像データで直接1ドットを表すのにRGB値を使用します。黒ドットを表す場合は0x000000、白ドットを表す場合は0xFFFFFFです。ビットカウント32の場合は、RGB値に0x00を付加した値を使用します。
- ボトムアップ形式で指定します。
【②情報ヘッダ】の【画像の高さ】に対応しています。ここに負数を設定するとトップダウン形式で格納することが可能です。トップダウンとは、左上から順番に、右下に向かってドットデータを格納していく方式です。
ボトムアップとは、左下から順番に、右上に向かってドットデータを格納していく方式です。
- 画像の各行のバイト数を4の倍数に合わせる必要があります。
ビットカウントが24の場合、1ドットを3byteで表すため、横ドット数の3倍が1行のバイト数になります。今回の例では、1行のバイト数は16×3=48ドットです。4の倍数になっているため、調整は不要です。
ビットカウントが32の場合、1ドットを4byteで表すため、1行のバイト数は必ず4の倍数になります。
以上のポイントを踏まえて、ビットカウンタが24の場合の画像データを作成すると以下のようになります。ビットカウンタが32の場合は、FFFFFFがFFFFFF00に、000000が00000000に置き換わるだけです。
では、BMPファイルの先頭から順番に値を見ていきます。
まずビットカウンタが24の場合です。
①ファイルヘッダ
項目 | サイズ | 値 | 内容 |
タイプ | 2 | 0x4D42 | 固定値 |
サイズ | 4 | 0x00000336 | ファイルサイズ(byte) |
予約領域 | 2 | 0x0000 | 0 |
予約領域 | 2 | 0x0000 | 0 |
オフセットビット | 4 | 0x00000036 | 画像データ先頭までのオフセット |
- サイズ:
ファイルヘッダサイズ[14byte]+
情報ヘッダサイズ[40byte]+
画像データサイズ[(横byte数)16byte×3×(縦byte数)16byte]=768
14byte+40byte+768byte=822byte=0x336
- オフセットビット:
ファイルヘッダサイズ[14byte]+
情報ヘッダサイズ[40byte]+
14byte+40byte=54byte=0x36
②情報ヘッダ
項目 | サイズ | 値 | 内容 |
情報ヘッダのサイズ | 4 | 0x00000028 | 固定値:40 |
画像の幅 | 4 | 0x00000010 | ピクセルで指定 |
画像の高さ | 4 | 0x00000010 | ピクセルで指定 |
プレーン数 | 2 | 0x0001 | 固定値:1 |
ビットカウント | 2 | 0x0018 | 24:1677万色 |
圧縮形式 | 4 | 0x00000000 | 固定値:0(無圧縮) |
画像データのサイズ | 4 | 0x00000300 | 【④画像データ】のByte数 |
横解像度 | 4 | 0x00000EC4 | 固定値:3780(96dpi) |
縦解像度 | 4 | 0x00000EC4 | 固定値:3780(96dpi) |
パレット数 | 4 | 0x00000000 | 固定値:0 |
パレットインデックス | 4 | 0x00000000 | 固定値:0 |
- 画像データのサイズ
横byte数×縦byte数=16byte×3byte×16byte=768byte=0x300
③カラーパレット
画像データで直接そのドットの色を指定するため、カラーパレットはありません。
次にビットカウンタが32の場合です。
①ファイルヘッダ
項目 | サイズ | 値 | 内容 |
タイプ | 2 | 0x4D42 | 固定値 |
サイズ | 4 | 0x00000436 | ファイルサイズ(byte) |
予約領域 | 2 | 0x0000 | 0 |
予約領域 | 2 | 0x0000 | 0 |
オフセットビット | 4 | 0x00000036 | 画像データ先頭までのオフセット |
- サイズ:
ファイルヘッダサイズ[14byte]+
情報ヘッダサイズ[40byte]+
画像データサイズ[(横byte数)16byte×4×(縦byte数)16byte]=1024
14byte+40byte+1024byte=1078byte=0x436
- オフセットビット:
ファイルヘッダサイズ[14byte]+
情報ヘッダサイズ[40byte]+
14byte+40byte=54byte=0x36
②情報ヘッダ
項目 | サイズ | 値 | 内容 |
情報ヘッダのサイズ | 4 | 0x00000028 | 固定値:40 |
画像の幅 | 4 | 0x00000010 | ピクセルで指定 |
画像の高さ | 4 | 0x00000010 | ピクセルで指定 |
プレーン数 | 2 | 0x0001 | 固定値:1 |
ビットカウント | 2 | 0x0020 | 24:1677万色 |
圧縮形式 | 4 | 0x00000000 | 固定値:0(無圧縮) |
画像データのサイズ | 4 | 0x00000400 | 【④画像データ】のByte数 |
横解像度 | 4 | 0x00000EC4 | 固定値:3780(96dpi) |
縦解像度 | 4 | 0x00000EC4 | 固定値:3780(96dpi) |
パレット数 | 4 | 0x00000000 | 固定値:0 |
パレットインデックス | 4 | 0x00000000 | 固定値:0 |
- 画像データのサイズ
横byte数×縦byte数=16byte×4byte×16byte=1024byte=0x400
③カラーパレット
画像データで直接そのドットの色を指定するため、カラーパレットはありません。
④画像データ
ここまで、ビットカウントが24の場合と、32の場合のBMPフォーマットについて具体例を用いて説明しました。
ビットマップフォントのフォーマットについてご質問・ご相談などございましたら、お気軽にお問い合わせください。
カルチスタッフ