BREW 文字認識アプリ "Recog"
BREW とビットマップ
IBitmap インターフェース
BREW でビットマップを取り扱う場合は、IBitmap インターフェースを使います。
今回の "Recog" では、カメラ撮影したビットマップ画像の各画素の情報を取得して解析するので、IBitmap インターフェースの IBITMAP_GetPixel 関数が使えそうです。
しかし、BREW エミュレータでは この API をサポートしていないので、使えません。
DDB と DIB
API が使えないので、BREW がビットマップの形式を調べて、ビットマップを保持するバッファに直接アクセスします。
BREW のビットマップには DDB と DIB の 2 種類があります。
DDB は機種依存ビットマップで、端末ハードウェアの内部形式です。
DIB は非機種依存ビットマップで、端末が異なっていてもデータ構造は同じです。
今回は、DIB 形式を採用します。
※ BREW には DDB と DIB を相互変換する関数があります。
DIB の構造
DIB は、次の IDIB 構造体で表現されています。
OBJECT(IDIB) { AEEVTBL(IDIB) *pvt; IQueryInterface * pPaletteMap; byte * pBmp; uint32 * pRGB; NativeColor ncTransparent; uint16 cx; uint16 cy; int16 nPitch; uint16 cntRGB; uint8 nDepth; uint8 nColorScheme ; uint8 reserved[6]; }
主なメンバと意味は、次の通りです。
メンバ | 意味 |
---|---|
cx | ビットマップの幅 |
cy | ビットマップの高さ |
nDepth | 色深度 |
nPitch | バッファ上の行間隔 |
pBmp | バッファへのポインタ |
■ nPitch について:
pBmp は、画像の左上端の点 (0, 0)のデータがある場所を指します。点 (0, 0) から点 (cx - 1, 0) までの 1 行分のデータが、pBmp を基点として連続的に保存されます。
ただし、点 (0, 1) のデータは pBmp + nPitch という場所にあり、点 (cx - 1, 1) までのデータは連続的に保存されます。
( 端末での処理が簡単になるように、画像データが 1 行ごとにパディングされます。)
後はこの繰り返しです。点 (0, y) のデータは pBmp + y * nPitch という場所にあります。
DIB の形式には 2 通りがあります。
上下反転させた 2 つの絵は DIB の格納方法を図示したものです。画像の左上端がメモリの下位バイト、画像の右下端がメモリの上位バイトを表します。
DIB には画像の上端がメモリの下位バイトにあるのか、メモリの上位バイトにあるのかで 2 つの形式があります。
左の絵では nPitch が正の値に、右の絵では nPitch が負の値になっているので、 DIB の形式に関係なく、各画素にアクセスできます。
1 画素のサイズが nDepth ビットのデータとして保存されます。画像上の点 (x, y) の場所は、「pBmp + y * nPitch」から数えて「x * nDepth」ビット目にあります。
SophiaFramework UNIVERSE では、IDIB 構造体の代わりに SFBDIB クラスのメンバ関数を使います。