ブログ

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を付加した値を使用します。

  • ボトムアップ形式で指定します。

【②情報ヘッダ】の【画像の高さ】に対応しています。ここに負数を設定するとトップダウン形式で格納することが可能です。トップダウンとは、左上から順番に、右下に向かってドットデータを格納していく方式です。

https://www.culti.co.jp/wp-content/uploads/2023_BMP_03_01.png

ボトムアップとは、左下から順番に、右上に向かってドットデータを格納していく方式です。

https://www.culti.co.jp/wp-content/uploads/2023_BMP_03_01.png

  • 画像の各行のバイト数を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フォーマットについて具体例を用いて説明しました。

ビットマップフォントのフォーマットについてご質問・ご相談などございましたら、お気軽にお問い合わせください。

カルチスタッフ

関連記事

カルチ発行書籍

  1. KEISコードブック_表紙
    2016年1月15日にKEISコードブックを発売しました。
ページ上部へ戻る