2025/11/26

QR コードの作画:#3)ビットマップのエンコード仕様

前回は、ビットマップデータが 4 つのブロックに分かれていることを紹介しました。今回は各ブロックの詳細な仕様と画像データのエンコードについてまとめます。 


ファイルヘッダ

ファイルヘッダの構造は単純で、14 バイトの固定長となっています。ブロック内は4つの役割に分割されています。


Byte 数
役割 説明
2 ファイルタイプ ビットマップを表す固定の文字列
4 ファイルサイズ ファイル全体のサイズ(バイト数)
4 予約領域 固定で 0 を設定
4 画像データの開始位置 ファイルの先頭からのバイト数を指定


◇ ファイルタイプ

ファイルタイプには 0x42 と 0x4D を指定します。これは文字に変換すると "B" と "M" で BitMap ファイルであることを表します。ファイルを読み込むプログラムではこの最初の 2 バイトでこのファイルはビットマップであると判定できるということですね。

別の記事『DXL Step-by-Step:#13)イメージの形式とサイズの取得』で PNG、GIF、JPEG のフォーマットについて解説しましたが、どのフォーマットも決められた位置にフォーマットを表す文字(値)がセットされています。後続のフォーマットがまねているので、ビットマップが画像ファイルの元祖って感じがしますね。


◇ ファイルサイズ

ビットマップファイル全体のバイト数を指定します。よって、この項目は画像データとして出力データ量が明確になってからでないと決定できない項目となります。


◇ 予約領域

今回利用しない項目です(何に使うか不明)。すべて 0x00 をセットすれば OK です。


◇ 画像データの開始位置

前回記載したように、白黒のビットマップではヘッダ領域のサイズは固定となり、62 バイトでした。ですので、 最後の項目の開始位置には 0x3E、0x00、0x00、0x00 を指定します。


情報ヘッダ

情報ヘッダも固定長で、40 バイトで構成されます。このエリアには、ビットマップファイルの画像フォーマットに関する情報が集約されています。色数や画像の幅や高さだけでなく、解像度の項目もあります。また、圧縮に関する項目もあるようなので、ビットマップって無圧縮だけではないようですね。

今回は白黒の QR コードを前提にしますので、情報ヘッダは次の通りとなります。赤い部分が画像に応じて可変になる部分です。


Byte 数
役割 説明
4 ヘッダサイズ 40 byte
4 画像の幅 ピクセル数
4 画像の高さ ピクセル数
2 プレーン数 1 を指定
2 色数(ビット数) 1 : 白黒、8 : 256色、24 : True Color など
4 圧縮形式
4 画像データサイズ 画像データブロックの byte 数
4 水平解像度
4 垂直解像度
4 パレットの色数 0 で色数から算出
4 重要色数 正確に表示すべき色数(パレットの前から)


カラーパレット

256 色以下のビットマップで存在するブロックとなります。パレットというだけあって、ビットマップ内の色番号を何色で表示するか指定する項目です。4 byte で 1 パレットの色を表します(R G B で 1 byte、予備 1 byte)。

今回は色数が 1 bit = 2 色なので、8 バイトの固定長となります。事例では、1 色目が黒で、2 色目が白としています。


画像データ

◇ エンコードの流れ

まず、画像データブロックの全体像について整理します。エンコードの基本仕様として、画像の下から上に変換するのが一般的です。

情報ヘッダの画像の高さにマイナス値を設定すると上から下にエンコードする仕様が定義されているようなのですが、画像ビューアが対応していないなど一般的ではないこともあるそうで、今回は利用しません。


◇ 1行分のエンコード

次に1行分のエンコード仕様についてまとめます。

今回色数は 1 bitなので画像は 2 進数として表現できます。1行分の各ピクセルを、白は1、黒は0で並べます。

1 行分のブロックは 4 バイトの倍数で表現する仕様なので、余った bit には 0 をセットします。これを 8 bit(= 1 byte)毎にファイルに書き込むという流れになります。


次回の予定

ビットマップの構造とエンコード仕様がわかったので、次回からはいよいよコーディングを開始します。


前回 QR コードの作画 次回


0 件のコメント:

コメントを投稿