5.12023
4.BMPファイルの画像データについて[4bitBMP]
こんにちは、カルチスタッフです。
前回に引き続き、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万色 |
前回は、ビットカウントが1の場合のフォーマットについて説明しました。今回は、ビットカウントが4の場合について、1文字1ファイルのフォントファイルを例にして、BMPフォーマットを説明したいと思います。
例として、前回同様、16x16の「永」の文字をBMPファイルフォーマットで表すことを考えます。Unicodeは0x6C38です。Windowsの標準アプリ「フォト」でbmpを見てみるとこのようになります。
アプリで開いた状態は、ビットカウントが1の場合と変わりません。
まず始めに、イメージを持ちやすいよう、BMPファイルの4つの構成のうちの【④画像データ】から説明します。
ビットカウントが4の場合、1ドットを表すのに使用できる領域は4bit、使用できる値は、0~15までの16個になります。
画像データを指定する時のポイントを示します。
●黒ドットを0x0、白ドットを0xFで指定します。
【③カラーパレット】に対応しています。カルチではビットカウントが4の場合、カラーパレットの値は以下のように指定しますが、色は任意に指定可能です。
カラーパレット |
値 |
0 |
0x00000000[黒色] |
1 |
0x00008000 |
2 |
0x00800000 |
3 |
0x00808000 |
4 |
0x80000000 |
5 |
0x80008000 |
6 |
0x80800000 |
7 |
0x80808000 |
8 |
0xC0C0C000 |
9 |
0x0000FF00 |
10 |
0x00FF0000 |
11 |
0x00FFFF00 |
12 |
0xFF000000 |
13 |
0xFF00FF00 |
14 |
0xFFFF0000 |
15 |
0xFFFFFF00[白色] |
フォントデータは白黒で使用することがほとんどなので、16個のカラーテーブルの内、使用するのは0x00と0x0Fの2つだけ、という場合が多いです。
このパレットの値を調整することで、なめらかな曲線をもつ他階調フォントを作成することも可能です。他階調フォントについてはこちらをご覧ください。
●ボトムアップ形式で指定します。
【②情報ヘッダ】の【画像の高さ】に対応しています。ここに負数を設定するとトップダウン形式で格納することが可能です。トップダウンとは、左上から順番に、右下に向かってドットデータを格納していく方式です。
ボトムアップとは、左下から順番に、右上に向かってドットデータを格納していく方式です。
●画像の各行のバイト数を4の倍数に合わせる必要があります。
1行のデータのバイト数は以下の式で求めることが出来ます。
(横ドット数+1)/2
16×16のフォントデータの場合、
(16+1)/2=8
になり、4の倍数になっているため、各行のバイト数を調整する必要はありません。
以上のポイントを踏まえて、画像データを作成すると以下のようになります。
では、BMPファイルの先頭から順番に値を見ていきます。
①ファイルヘッダ
項目 |
サイズ |
値 |
内容 |
タイプ |
2 |
0x4D42 |
固定値 |
サイズ |
4 |
0x000000F6 |
ファイルサイズ(byte) |
予約領域 |
2 |
0x0000 |
0 |
予約領域 |
2 |
0x0000 |
0 |
オフセットビット |
4 |
0x00000076 |
画像データ先頭までのオフセット |
●サイズ:
ファイルヘッダサイズ[14byte]+
情報ヘッダサイズ[40byte]+
カラーテーブルサイズ[4byte*16]+
画像データサイズ[(横byte数)8byte*(縦byte数)16byte]=128
14byte+40byte+64byte+128byte=246=0xF6
●オフセットビット:
ファイルヘッダサイズ[14byte]+
情報ヘッダサイズ[40byte]+
カラーテーブルサイズ[4byte*16]+
14byte+40byte+64byte =118byte=0x76
②情報ヘッダ
項目 |
サイズ |
値 |
内容 |
情報ヘッダのサイズ |
4 |
0x00000028 |
固定値:40 |
画像の幅 |
4 |
0x00000010 |
ピクセルで指定 |
画像の高さ |
4 |
0x00000010 |
ピクセルで指定 |
プレーン数 |
2 |
0x0001 |
固定値:1 |
ビットカウント |
2 |
0x0004 |
4:16色 |
圧縮形式 |
4 |
0x00000000 |
固定値:0(無圧縮) |
画像データのサイズ |
4 |
0x00000080 |
【④画像データ】のByte数 |
横解像度 |
4 |
0x00000EC4 |
固定値:3780(96dpi) |
縦解像度 |
4 |
0x00000EC4 |
固定値:3780(96dpi) |
パレット数 |
4 |
0x00000000 |
固定値:0 |
パレットインデックス |
4 |
0x00000000 |
固定値:0 |
●画像データのサイズ
横byte数×縦byte数=8byte×16byte=128byte=0x80
③カラーパレット
項目 |
サイズ |
値 |
内容 |
カラーパレット0 |
4 |
0x00000000 |
0x0の時は黒色 |
カラーパレット1 |
4 |
0x00008000 |
|
: : |
: : |
: : |
: : |
カラーパレット14 |
4 |
0xFFFF0000 |
|
カラーパレット15 |
4 |
0xFFFFFF00 |
0xFの時は白色 |
ここまで、ビットカウントが4の場合のBMPフォーマットについて具体例を用いて説明しました。
ビットマップフォントのフォーマットについてご質問・ご相談などございましたら、お気軽にお問い合わせください。
カルチスタッフ