これは何?
Blacktank LPC1769からは複数の派生プロジェクトが生まれています。
Natural Tiny Shell (NT-Shell)もその一つですが、今回は小規模組み込みシステムでも使えるBMPライブラリ(Tiny BMP I/O)について触れます。
Tiny BMP I/Oは、BMP Data StreamからBMPイメージを読み込んでPixel Storageにピクセル値を格納したり、Pixel Storageからピクセル値を読み込んで、BMP Data StreamにBMPイメージを書き込んだりすることのできるライブラリです。一般に書かれたライブラリでは、「BMPデータがどこに格納されているのか=ファイルに格納されている」、「ピクセルデータがどこに格納されているのか=メモリ」という暗黙の前提が使われている事が多いのですが、Tiny BMP I/Oはそれらをシステム依存として捉えて設計してあります。システムに依存する部分をきちんと切り出す事で「1つのライブラリでSDからも、フラッシュからもSRAMからだって読める!」、「カメラから読んだ画像を簡単にBMPファイルにできる!」など、色々な用途で使用する事が可能になります。
例えば、「SDカードにあるファイルを読み込んで液晶に表示したい」とか「カメラから取り出した映像をファイルに書き込みたい」などはすぐに考える事のできる応用例の1つです。また、それだけではつまらないのでbmpimg_tというキャンバスに対して描画可能なプチユティリティも装備しました。描きたいパターンをさっと実現してファイル化する事が可能です。
int bmpimg_draw_box(bmpimg_t *p, const int x1, const int y1, const int x2, const int y2, bmpcol_t *color);
int bmpimg_fill_box(bmpimg_t *p, const int x1, const int y1, const int x2, const int y2, bmpcol_t *color);
int bmpimg_draw_string(bmpimg_t *p, const int x, const int y, const int size, const char *text, bmpcol_t *color);
int bmpimg_draw_line(bmpimg_t *p, const int x1, const int y1, const int x2, const int y2, bmpcol_t *color);
int bmpimg_draw_pixel(bmpimg_t *p, const int x, const int y, bmpcol_t *color);
機能
-
24ビットBMPファイルの入出力に対応。
-
特定プラットフォームに非依存。
-
便利な描画用ユティリティ付属。
-
その他。
簡単に使えます
Tiny BMP I/Oはシステムに依存する以下の機能を実装するだけで簡単に使えます。
-
データのリード、ライト関数
-
ピクセルのリード、ライト関数
データのリード、ライト関数は、BMPのイメージが直列化されて格納されている領域を、ストリームとして入出力するための機能を提供するものです。
ピクセルのリードライト関数は、画像を実際に表示したりするための入出力機能を提供するものです。
ポイント
この手のライブラリは世の中に溢れています。
「また車輪の再開発か」と言われそうですが、必ずしもそうではありません。
ここではTiny BMP I/Oで考慮されている点を挙げてみます。
-
データがどこに格納されているのか?に依存しない。
-
画像ピクセルがどこに、どのように格納されているのか?に依存しない。
データがどこに格納されているのか?に依存しない。
小規模組み込みシステムでは、データが必ずファイルシステム上に存在するとは限りません。
一般に流通しているライブラリの多くは「データはファイルシステム上のファイルとして存在する事」を前提に設計実装されています。これらのライブラリを使用する場合、小規模組み込みシステムにファイルシステムとlibcをポートする事になります。
Tiny BMP I/Oは、データがどこに格納されいるのか?についての前提を持ちません。
それがファイルシステム上であろうが、フラッシュメモリ上であろうが、SRAM上であろうが、何の問題もありません。
画像ピクセルがどこに、どのように格納されているのか?に依存しない。
ここで言う「画像ピクセル」とは、データを読み込んで解釈した映像の1つ1つのピクセルを指します。
「画像ピクセルがどこに格納されているのか?」ですが、普通に考えるとメモリ上に格納するわけですが、ちょっとした画像ファイルでも結構な容量になってしまいます。例えば、1920x1080ピクセルでR, G, Bの各レイヤーが8ビットだったとすると、1920x1080x1x3=6,220,800[Bytes] (約6[MB])になってしまいます。潤沢なメモリが対象システムに存在するかどうかはシステム次第です。
読み込んだデータをそのままディスプレイに表示させたいだけの場合もあります。
この場合、わざわざ読み込んだデータをメモリ上に展開する必要はありません。
そのまま表示してしまえば良いのです。
巷に出回っているBMPライブラリの多くは、画像ピクセルデータをメモリに展開する事を前提で書かれているため、小規模組み込みシステムでそのまま使用することは難しい事があります。
Tiny BMP I/Oはシステムに対するインターフェースを規定して設計してあります。
このインターフェースさえ守れば、画像ピクセルがどこにどのように格納されていても問題ありません。
サンプルプログラムの動作とその出力画像
サンプルプログラムでは、インターフェースの動作を的確に示すために、汎用プラットフォームで動作するコードを示しています。このコードを見れば、Tiny BMP I/Oが規定している入出力インターフェースを簡単に理解することができます。
実際にTiny BMP I/Oを使って出力したサンプル画像を示します。
サンプルプログラムでは、汎用プラットフォーム向けの実装を提供していますが、Tiny BMP I/Oのインターフェースに従った実装をプラットーフォーム向けに提供しているだけです。
プラットフォームに依存した部分を書き換えれば色々なプラットフォームで使うことができます。
Download
Here is the source code package.
History
Date |
Description |
2012/09/23 |
Initial version |
戻る