ビットマップ画像をファイルに変換する

  • 投稿日:
  • by
  • カテゴリ:



フリーソフトを使う?


固定bpp、固定サイズのビットマップイメージを画像ファイルに変換したいだけなら、ビットマップファイルのヘッダを付けるだけでよいです。


で、ヘッダの構造の資料を眺めながら、ヘッダをポチポチ書いていくのも結構だとは思います。


BMPについてはまとまっていて分かりやすい資料がたくさんありますからね。


たとえばこちら。


BMP ファイルフォーマット


http://www.kk.iij4u.or.jp/~kondo/bmp/


ですが、固定フォーマットなら、Windowsマシン上などでファイルを作って、ヘッダ部分だけ拝借するのが最短コースです。


例えば、256x48ピクセルのモノクロディスプレイの画面イメージなら、



  • ペイントで、256x48ピクセルの画像を作り


f:id:syasuda:20101229143729j:image


f:id:syasuda:20101229143730p:image



  • 名前を付けて保存で、モノクロビットマップを指定


f:id:syasuda:20101229143731p:image



  • バイナリエディタでヘッダだけゲット


f:id:syasuda:20101229143732p:image


普通、説明するならこれだけで充分なのですが、最近は最後まで説明しないと不親切認定されるらしいので、続けます。



  • バイナリエディタを使って、ヘッダだけのファイルを保存


f:id:syasuda:20101229143733p:image



  • copyコマンドでヘッダとビットマップイメージ(256x48ピクセルでモノクロ、32*48バイトサイズ)を連結



c:\>copy /b BMPモノクロヘッダ256x48.img + BMPモノクロ256x48_真黒.img BMPモノクロ256x48_真黒.bmp


# BMPモノクロヘッダ256x48.imgはヘッダだけのファイル(0x3eバイト)


# BMPモノクロ256x48_真黒.imgはモノクロのビットマップイメージ(256÷8x48バイトの0x00埋めのデータ)


# BMPモノクロ256x48_真黒.bmpは連結して生成するファイル名



こうやって、作れば、以下のように真っ黒のビットマップファイルができます。


f:id:syasuda:20101229143734p:image


実際にこのやり方でLCD画面のイメージをBMPファイル化してみれば分かることですが、いくつか引っかかる点があると思います。



  1. 画像の天地や左右が逆になる

  2. 白と黒が逆になる


画像の天地が逆になるのは、イメージデータを吐き出させるときにラインごとに逆順にするか、面倒ならヘッダのイメージの高さ情報にマイナス符号を付ければよいです。左右が逆になるのは、ビットの並びを反転させないといけませんが、ビット単位なのでこれはちょっと面倒でしょうね。


白と黒が逆になるのは、ビットごとに反転させればよいので、0xffとxorを取るだけです。


上記2点については、プログラムで処理しないとどうにもならないかと思います。ですが、そのときでもヘッダの構造体を3つも作って、吐き出すようにするのはお勧めできません。



char header[]= { 'B', 'M', ... };



というように定義することをお勧めします。


書いてみればわかることですが、このわずか数十行のプログラムをLCDのフレームバッファの描画転送ルーチンの前後に追加すれば、いつでもLCDのイメージをファイルに出力することが出来ます。スクリーンショットですな。


世の中には、



LCDはepsonの専用コントローラだから、スクリーンショットなんか撮れるわけねぇ。



などと本気で強弁する人もいます。近づきたくないものです。


というわけで、BMP書き出しルーチンを何百行も書いたり、何十MBもある画像変換ルーチンを苦労してコンパイルして、それをリンクするのに手間取るくらいなら、最短3分で終わる上記手順を真似していただくのが良いかと思います。