DDB とは ?
DDB (デバイス デペンデント ビットマップ) とは、 携帯電話の画面表示に利用されている低レベルなビットマップです。 DDB はハードウェア処理に適した形式をしている反面、 携帯電話のハードウェアごとに形式が異なる可能性があるという欠点があります。 また、DDB はデバイス ビットマップと呼ばれる事もあります。
DDB (デバイス デペンデント ビットマップ) とは、 携帯電話の画面表示に利用されている低レベルなビットマップです。 DDB はハードウェア処理に適した形式をしている反面、 携帯電話のハードウェアごとに形式が異なる可能性があるという欠点があります。 また、DDB はデバイス ビットマップと呼ばれる事もあります。
DIB (デバイス インディペンデント ビットマップ) とは、ハードウェアに依存しない形式のビットマップです。 DIB を利用することにより、異なる機種の携帯電話やパソコンとの間でビットマップの交換が可能になります。
ビットマップの画像サイズを取得するには、 IBitmap インターフェイスの IBITMAP_GetInfo 関数を使用します。 IBITMAP_GetInfo 関数を使うと、ビットマップの情報を AEEBitmapInfo 構造体として取得できます。
AEEBitmapInfo 構造体は、以下のように定義されています。
typedef struct { uint32 cx; // ビットマップの幅 uint32 cy; // ビットマップの高さ uint32 nDepth; // 色深度のビット数 } AEEBitmapInfo;
SophiaFramework では、 SFBBitmp::GetInfo 関数を使用します。
// // ビットマップの画像サイズを取得します。 // // リソース ファイルから読み込むビットマップ画像のリソース ID #define IDB_MY_PICTURE 0x0001 // ビットマップの情報を保存する構造体 AEEBitmapInfo bmpInfo; // SFBShell のインスタンスを取得します。 SFBShellSmp shell(SFBShell::GetInstance()); // ビットマップをリソースから読み込みます。 SFBBitmapSmp bmp = shell->LoadResBitmap(MYRESOURCE_RES_FILE, IDB_MY_PICTURE); // ビットマップの情報を取得します。 bmp->GetInfo(&bmpInfo);
// // ビットマップの画像サイズを取得します。 // // リソース ファイルから読み込むビットマップ画像のリソース ID #define IDB_MY_PICTURE 0x0001 // ビットマップの情報を保存する構造体 AEEBitmapInfo bmpInfo; // SFBShell のインスタンスを取得します。 SFBShellSmp shell(SFBShell::GetInstance()); // ビットマップをリソースから読み込みます。 SFBBitmapSmp bmp = shell->LoadResBitmap(MYRESOURCE_RES_FILE, IDB_MY_PICTURE); // ビットマップの情報を取得します。 bmp->GetInfo(&bmpInfo);
ビットマップを描画するには、 IDisplay インターフェイスの IDISPLAY_BitBlt 関数や IBitmap インターフェイスの IBITMAP_BltIn 関数を使用します。
SophiaFramework では、 SFXGraphics::BitBlt 関数、SFBDisplay::BitBlt関数やSFBBitmap::BltIn 関数を使用します。
// // ディスプレイにビットマップを表示します。 // // リソース ファイルから読み込むビットマップ画像のリソース ID #define IDB_MY_PICTURE 0x0001 IShell* shell = app->a.m_pIShell; IDisplay* display = app->a.m_pIDisplay; IBitmap* bmp; // リソース ファイルからビットマップを取得します。 bmp = ISHELL_LoadResBitmap(shell, MYRESOURCE_RES_FILE, IDB_MY_PICTURE); if (bmp != NULL) { // IDisplay インターフェイスを使用してビットマップを描画します。 IDISPLAY_BitBlt(display, // オブジェクト 0, // 転送先の X 座標 0, // 転送先の Y 座標 100, // 転送先の幅 100, // 転送先の高さ bmp, // 転送元のビットマップ 0, // 転送元の転送開始 X 座標 0, // 転送元の転送開始 Y 座標 AEE_RO_COPY); // 転送方法 // 画面を更新します。 IDISPLAY_Update(display); // ビットマップを破棄します。 IBITMAP_Release(bmp); }
// // ディスプレイにビットマップを表示します。 // // リソース ファイルから読み込むビットマップ画像のリソース ID #define IDB_MY_PICTURE 0x0001 SFBShellSmp shell = SFBShell::GetInstance(); SFBDisplaySmp display = SFBDisplay::GetInstance(); SFBBitmapSmp bmp; // リソース ファイルからビットマップを取得します。 bmp = shell->LoadResBitmap(MYRESOURCE_RES_FILE, IDB_MY_PICTURE); if (bmp != NULL) { // SFBDisplay インターフェイスを使用してビットマップを描画します。 display->BitBlt(SFXRectangle(0, 0, 100, 100), // 転送先の矩形 bmp, // 転送元のビットマップ SFXGrid(0, 0)); // 転送元の転送開始座標 // 画面を更新します。 display->Update(); }
ビットマップを拡大して描画するには、 ITransform インターフェイスの ITRANSFORM_TransformBltSimple 関数、 もしくは、ITRANSFORM_TransformBltComplex 関数を使用します。 単純な拡大表示を行うのであれば、ITRANSFORM_TransformBltSimple 関数を使用します。
SophiaFramework では、 SFBTransform::TransformBltSimple 関数や SFBTransform::TransformBltComplex 関数を使用します。
// // ビットマップを拡大して描画します。 // // リソース ファイルから読み込むビットマップ画像のリソース ID #define IDB_MY_PICTURE 0x0001 IShell* shell = app->a.m_pIShell; IDisplay* display = app->a.m_pIDisplay; IBitmap* dev; IBitmap* tmp; IBitmap* bmp; ITransform* transform; // 画面を緑色でクリアします。 IDISPLAY_SetColor(display, CLR_USER_BACKGROUND, MAKE_RGB(0xCC, 0xFF, 0xCC)); IDISPLAY_ClearScreen(display); // デバイスのビットマップを取得します。 IDISPLAY_GetDeviceBitmap(display, &dev); // デバイスビットマップと互換性のある作業用ビットマップを作成します。 IBITMAP_CreateCompatibleBitmap(dev, &tmp, 100, 100); // リソース ファイルからビットマップを取得します。 bmp = ISHELL_LoadResBitmap(shell, MYRESOURCE_RES_FILE, IDB_MY_PICTURE); if (bmp != NULL) { // 作業用ビットマップにビットマップを描画します。 IBITMAP_BltIn(tmp, 0, 0, 100, 100, bmp, 0, 0, AEE_RO_COPY); // デバイスビットマップから ITransform インターフェイスを取得します。 IBITMAP_QueryInterface(dev, AEECLSID_TRANSFORM, &transform); // 作業用ビットマップからデバイスビットマップへ変形転送します。 ITRANSFORM_TransformBltSimple(transform, // オブジェクト 0, // 転送先の X 座標 0, // 転送先の Y 座標 tmp, // 転送元のビットマップ 0, // 転送元の転送開始 X 座標 0, // 転送元の転送開始 Y 座標 100, // 転送元の幅 100, // 転送元の高さ TRANSFORM_SCALE_2, // 変形方法 COMPOSITE_OPAQUE); // 転送モード // ITransform インターフェイスを破棄します。 ITRANSFORM_Release(transform); // ビットマップを破棄します。 IBITMAP_Release(bmp); } // 画面を更新します。 IDISPLAY_Update(display); // 作業用ビットマップを破棄します。 IBITMAP_Release(tmp); // デバイスビットマップを破棄します。 IBITMAP_Release(dev);
// // ビットマップを拡大して描画します。 // // リソース ファイルから読み込むビットマップ画像のリソース ID #define IDB_MY_PICTURE 0x0001 SFBShellSmp shell = SFBShell::GetInstance(); SFBDisplaySmp display = SFBDisplay::GetInstance(); SFBBitmapSmp dev; SFBBitmapSmp tmp; SFBBitmapSmp bmp; SFBTransformSmp transform; // 画面を緑色でクリアします。 display->SetColor(CLR_USER_BACKGROUND, SFXRGBColor(0xCC, 0xFF, 0xCC, 0x00)); display->ClearScreen(); // デバイスのビットマップを取得します。 dev = display->GetDeviceBitmap(); // デバイスビットマップと互換性のある作業用ビットマップを作成します。 tmp = dev->CreateCompatibleBitmap(SFXSize(100, 100)); // リソース ファイルからビットマップを取得します。 bmp = shell->LoadResBitmap(MYRESOURCE_RES_FILE, IDB_MY_PICTURE); if (bmp != NULL) { // 作業用ビットマップにビットマップを描画します。 tmp->BltIn(SFXRectangle(0, 0, 100, 100), bmp, SFXGrid(0, 0)); // デバイスビットマップから SFBTransform インターフェイスを取得します。 transform = SFBTransform::NewInstance(dev); // 作業用ビットマップからデバイスビットマップへ変形転送します。 transform->TransformBltSimple(SFXGrid(0, 0), // 転送先の座標 tmp, // 転送元のビットマップ SFXRectangle(0, 0, 100, 100), // 転送元の矩形 TRANSFORM_SCALE_2); // 変形方法 } // 画面を更新します。 display->Update();
IBitmap インターフェイスと IImage インターフェイスには、以下の違いがあります。
透過色をもつビットマップを描画するには、 IBITMAP_SetTransparencyColor 関数を使用して透過色を設定します。 デフォルトの透過色は、マゼンタ色(R:255, G:0, B:255)です。 その後、引数に AEE_RO_TRANSPARENT を指定して、IDISPLAY_BitBlt などの描画関数を呼び出します。
SophiaFramework では、 SFBBitmap::SetTransparencyColor を使用して透過色を設定します。 その後、引数に AEE_RO_TRANSPARENT を指定して SFBDisplay::BitBlt などの描画関数を呼び出します。
// // 透過色を使用したビットマップを描画します。 // // リソース ファイルから読み込むビットマップ画像のリソース ID #define IDB_MY_PICTURE 0x0001 IShell* shell = app->a.m_pIShell; IDisplay* display = app->a.m_pIDisplay; IBitmap* bmp; // 透過色を含んだ画像を描画します。 // リソース ファイルから透過色を含んだビットマップを取得します。 bmp = ISHELL_LoadResBitmap(shell, MYRESOURCE_RES_FILE, IDB_MY_PICTURE); if (bmp != NULL) { // 描画するビットマップの透過色をマゼンタ色に設定します。 IBITMAP_SetTransparencyColor(bmp, IBITMAP_RGBToNative(bmp, MAKE_RGB(255, 0, 255))); // AEE_RO_TRANSPARENT モードで描画します。 IDISPLAY_BitBlt(display, 0, 0, 100, 100, bmp, 0, 0, AEE_RO_TRANSPARENT); // ビットマップを破棄します。 IBITMAP_Release(bmp); } // 画面を更新します。 IDISPLAY_Update(display);
// // 透過色を使用したビットマップを描画します。 // // リソース ファイルから読み込むビットマップ画像のリソース ID #define IDB_MY_PICTURE 0x0001 SFBShellSmp shell = SFBShell::GetInstance(); SFBDisplaySmp display = SFBDisplay::GetInstance(); SFBBitmapSmp bmp; // 透過色を含んだ画像を描画します。 // リソース ファイルから透過色を含んだビットマップを取得します。 bmp = shell->LoadResBitmap(MYRESOURCE_RES_FILE, IDB_MY_PICTURE); if (bmp != NULL) { // 描画するビットマップの透過色をマゼンタ色に設定します。 bmp->SetTransparencyColor(bmp->ColorToNative(SFXRGBColor(255, 0, 255, 0))); // AEE_RO_TRANSPARENT モードで描画します。 display->BitBlt(SFXRectangle(0, 0, 100, 100), bmp, SFXGrid(0, 0), AEE_RO_TRANSPARENT); } // 画面を更新します。 display->Update();
BREW Compressed Image 作成ツール (以降、BCI ツール) とは、 画像の圧縮やアニメーションを作成するツールです。 このツールで作成した画像は、BCI 形式でファイル (以降、BCI ファイル) に保存されます。
BCI ファイルとは、BCI ツールで作成される圧縮ファイルの形式です。 IImage インターフェイスを使用して BCI ファイルを扱うと、 携帯電話上で簡単に圧縮画像やアニメーションの表示ができます。
詳細は、『BREW BCI ガイド』を参照してください。
BREW 2 Bit Tool とは、4 ビットの BMP 形式のビットマップ (以降、ビットマップ) と 2 ビットのビットマップを変換するツールです。 このツールを使用すると、Windows に付属のペイント ツールでは作成できない 2 ビット (モノクロ 4 階調) のビットマップが作成できます。
2 ビットのビットマップを使用する利点は、画像サイズを小さくできることです。 白と黒の濃淡で画像を作成する場合に使用します。 BREW アプリで 2 ビットのビットマップを使用する場合は、 IBitmap インターフェイスを使用します。
詳細は、『BREW ユーティリティ ガイド』の「BREW 2 Bit Tool の使用」を参照してください。
「BREW API リファレンス 2.0」には、 IImage インターフェイスにより JPEG 画像をロードできると記述されていますが、 実際にJPEG 画像をロードできるかどうかは実機に依存します。 また、その処理内容も実機により変化する可能性があります。
当社の調査では、JPEG 8bit グレースケール画像を表示すると 色が変化してしまうことを確認しております。 この現象はエミュレータおよびいくつかの実機で発生します。
グレースケール以外の JPEG 画像は正常に描画されます。 また、PNG 8bit グレースケール画像は IImage インターフェイスにより 正常に描画されます。
IUnzipStream を使えば、gzip 形式の圧縮データを展開できます。
WindowsBMP 以外の (IImage インターフェイスでのみ扱うことができる) 形式の画像でも、透過色は扱えます。
例として PNG 形式の画像を元に説明をします。透過モードで PNG 形式の画像をデバイスピットマップに転送するには、以下の手順を踏みます。このとき、使用する PNG 形式の画像は、透過設定をして作成してください。
[手順]
IShell* shell = app->a.m_pIShell; IDisplay* display = app->a.m_pIDisplay; IImage* icon = NULL; IImage* tile = NULL; // リソース ファイルから PNG イメージを読み込みます。 icon = ISHELL_LoadResImage(shell, IIMAGETRANS_RES_FILE, IDI_ICON_PNG); tile = ISHELL_LoadResImage(shell, IIMAGETRANS_RES_FILE, IDI_TILE_PNG); // タイルを描画します。(背景の描画をします。) if (tile != NULL) { // タイルをデバイスビットマップに描画します。 IIMAGE_Draw(tile, // オブジェクト 0, // 描画先の X 座標 0); // 描画先の Y 座標 // イメージ破棄を破棄します。 IIMAGE_Release(tile); } // アイコンを描画します。(重ね合わせる画像を表示します。) if (icon != NULL) { // IImage (icon) の透過設定をします。 // IPARM_ROP は、ラスタを操作することを示しています。 // AEE_RO_TRANSPARENT は、透過モードでイメージ画像を扱うことを示しています。 IIMAGE_SetParm(icon, IPARM_ROP, AEE_RO_TRANSPARENT, 0); // アイコンをデバイスビットマップに描画します。 IIMAGE_Draw(icon, // オブジェクト 0, // 描画先の X 座標 0); // 描画先の Y 座標 // イメージ破棄を破棄します。 IIMAGE_Release(icon); } // 画面の更新をします。 IDISPLAY_Update(display);
BREW ではディスプレイ オブジェクトは 1 つしか作成することができません。このオブジェクトはアプリ起動時に自動的に作成され、アプリ実行中はこのオブジェクトを共有することになります。
アイコンに使用する PNG 画像の透過色を設定するためには、次のいずれかの画像を使用します。
24 ビットの透過 PNG および不透過 PNG、8 ビットの不透過 PNG は、IIMAGE_Draw() により透明にはなりません。一方、8 ビットの透過 PNG で透過色が設定された場合のみ、IIMAGE_Draw() により透明になります。この際、8 ビット PNG で背景色として設定されたパレットだけが透明になります。ただしパレット 0 番が透過色として設定されていない場合、その色で描画されます。また IBITMAP_SetTransparencyColor() を呼び出しても IIMAGE_Draw() による描画には影響を与えません。
「BREW 2.1 新インターフェイスリファレンス」によりますと、スナップショットモードを使用した場合に、ICAMERA_SetVideoEncode、ICAMERA_SetMediaData、ICAMERA_EncodeSnapshot の各関数を使用して JPEG 形式で画像を保存できるようです。
JPEG 画像をファイルから読み込み描画するには、次のようにします。
[注意] BREW SDK 2.1 のエミュレータでは、AEECLSID_JPEG が未対応のクラス ID のようです。このため、エミュレータでは JPEG 画像の表示ができないようです。
機種によっては、ICAMERA_SetVideoEncode、ICAMERA_SetMediaData、ICAMERA_EncodeSnapshot の各関数を使用することで JPEG 形式のカメラ画像をファイルに保存できるようです。