2014年2月14日金曜日

Bitmapイメージをサクッと作るヘッダー

BitmapImageのヘッダです
以下のヘッダを使うと4bitのBitmap画像を作ることができます

const uint8_t BitmapHeader[] = {
0x42, 0x4D, /* ファイルタイプ:"BM" */
0x00, 0x00, 0x00, 0x00, /* ファイルサイズ(0固定でOK) */
0x00, 0x00, 0x00, 0x00, /* 予約領域(2バイトx2個) */
0x00, 0x02, 0x00, 0x00, /* データオフセット 512バイト */
0x28, 0x00, 0x00, 0x00, /* 情報ヘッダサイズ:40(0x28) Windows bitmap */
0x00, 0x00, 0x00, 0x00, /* 画像の幅 常に正数 */
0x00, 0x00, 0x00, 0x00, /* 画像の高さ 負数だと上から下へ */
0x01, 0x00, /* プレーン数 1で固定 */
0x04, 0x00, /* 1ピクセルのデータビット数 4bitモード */
0x00, 0x00, 0x00, 0x00, /* 圧縮形式:無圧縮 */
0x00, 0x00, 0x00, 0x00, /* データサイズ:0固定でOK */
0x00, 0x00, 0x00, 0x00, /* 横解像度:0固定でOK */
0x00, 0x00, 0x00, 0x00, /* 縦解像度:0固定でOK */
0x00, 0x00, 0x00, 0x00, /* 格納されてるパレット数:0固定でOK */
0x00, 0x00, 0x00, 0x00, /* 重要なパレットのインデックス:0固定でOK */
/* 以下パレット 4bit画像の場合16色まで作成可能 */
0x00, 0x00, 0x00, 0x00, /* 00: 黒       */
0xFF, 0xFF, 0xFF, 0xFF, /* 01: 白       */
0xFF, 0x00, 0x00, 0x00, /* 02: 青       */
0x00, 0xFF, 0x00, 0x00, /* 03: 緑       */
0x00, 0x00, 0xFF, 0x00, /* 04: 赤       */
0xFF, 0xFF, 0x00, 0x00, /* 05: シアン   */
0x00, 0xFF, 0xFF, 0x00, /* 06: マゼンタ */
0xFF, 0x00, 0xFF, 0x00, /* 07: イエロー */
0x7F, 0x7F, 0x7F, 0x00, /* 08: グレイ   */
};

使い方は
まず512バイトのメモリを確保します
それをmemsetで0x00で初期化します
次にmemcpyで上記配列をコピーします
この配列は大きさを定義していないので、sizeofで配列長を指定する必要があります

このヘッダは画像の幅と高さを設定するだけで使うことができます
ファイルサイズ等は0固定でも画像として認識されます(少なくともWin7やPicasaでは)

幅と高さは一旦int32_t*型のポインタを作ってから、それに代入する形で行います
int32_t *w = (int32_t*)(&hoge[0x12));
int32_t *h = (int32_t*)(&hoge[0x16]);
みたいな感じで
幅は符号なしですが、高さは符号ありで扱います

画像ファイルはRGB値の指定ではなく、カラーパレットの番号を指定します
なので写真等の保存には向きません
256色等であれば多少はマシになりますが、最適化をしない場合は期待できないでしょう
せいぜいグラフを画像データとして保存する 程度の使い方が限界になります

なお、BitmapはRGBではなく、BGRの並びで、かつ予約があるので全体で32bitになります
パレットを追加する場合はその点に注意してください

1ピクセルのデータビット数を4から8にすれば256色Bitmapになります


そもそもマイコンで画像ファイル作るなよ というのはありますが、マイコンにかぎらず、Bitmap画像は簡単に作成することができます

0 件のコメント:

コメントを投稿