ホーム > デベロッパ > BREW FAQ

BREW FAQ : 画像

DDB とは ?

DDB (デバイス デペンデント ビットマップ) とは、 携帯電話の画面表示に利用されている低レベルなビットマップです。 DDB はハードウェア処理に適した形式をしている反面、 携帯電話のハードウェアごとに形式が異なる可能性があるという欠点があります。 また、DDB はデバイス ビットマップと呼ばれる事もあります。

      

DIB とは ?

DIB (デバイス インディペンデント ビットマップ) とは、ハードウェアに依存しない形式のビットマップです。 DIB を利用することにより、異なる機種の携帯電話やパソコンとの間でビットマップの交換が可能になります。

      

ビットマップの画像サイズを取得するには ?

ビットマップの画像サイズを取得するには、 IBitmap インターフェイスの IBITMAP_GetInfo 関数を使用します。 IBITMAP_GetInfo 関数を使うと、ビットマップの情報を AEEBitmapInfo 構造体として取得できます。

AEEBitmapInfo 構造体は、以下のように定義されています。

typedef struct {
 uint32  cx;      // ビットマップの幅
 uint32  cy;      // ビットマップの高さ
 uint32  nDepth;  // 色深度のビット数
} AEEBitmapInfo;

SophiaFramework では、 SFBBitmp::GetInfo 関数を使用します。

[ BREW API のみを使用したコード ]

//
// ビットマップの画像サイズを取得します。
//

// リソース ファイルから読み込むビットマップ画像のリソース 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);

[ SophiaFramework を使用したコード ]

//
// ビットマップの画像サイズを取得します。
//

// リソース ファイルから読み込むビットマップ画像のリソース 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 関数を使用します。

[ BREW API のみを使用したコード ]

//
// ディスプレイにビットマップを表示します。
//

// リソース ファイルから読み込むビットマップ画像のリソース 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);
}

[ SophiaFramework を使用したコード ]

//
// ディスプレイにビットマップを表示します。
//

// リソース ファイルから読み込むビットマップ画像のリソース 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 関数を使用します。

[ BREW API のみを使用したコード ]

//
//  ビットマップを拡大して描画します。
//

// リソース ファイルから読み込むビットマップ画像のリソース 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);

[ SophiaFramework を使用したコード ]

//
//  ビットマップを拡大して描画します。
//

// リソース ファイルから読み込むビットマップ画像のリソース 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 インターフェイスと IImage インターフェイスには、以下の違いがあります。

  • IBitmap インターフェイスは、ビットマップを扱うためのインターフェイスです。デバイス ビットマップや BMP の表示や編集が行えます。 また、BMP の表示だけを行うのであれば、IImage インターフェイスよりも高速な処理が可能です。
  • IImage インターフェイスは、BMP、PNG、JPEG、BCI の各形式の画像を表示するインターフェイスです。 デバイス ビットマップを扱うことはできません。
      

透過色をもつビットマップを描画するには ?

透過色をもつビットマップを描画するには、 IBITMAP_SetTransparencyColor 関数を使用して透過色を設定します。 デフォルトの透過色は、マゼンタ色(R:255, G:0, B:255)です。 その後、引数に AEE_RO_TRANSPARENT を指定して、IDISPLAY_BitBlt などの描画関数を呼び出します。

SophiaFramework では、 SFBBitmap::SetTransparencyColor を使用して透過色を設定します。 その後、引数に AEE_RO_TRANSPARENT を指定して SFBDisplay::BitBlt などの描画関数を呼び出します。

[ BREW API のみを使用したコード ]

//
//  透過色を使用したビットマップを描画します。
//

// リソース ファイルから読み込むビットマップ画像のリソース 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);

[ SophiaFramework を使用したコード ]

//
//  透過色を使用したビットマップを描画します。
//

// リソース ファイルから読み込むビットマップ画像のリソース 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 (圧縮画像) 作成ツールとは ?

BREW Compressed Image 作成ツール (以降、BCI ツール) とは、 画像の圧縮やアニメーションを作成するツールです。 このツールで作成した画像は、BCI 形式でファイル (以降、BCI ファイル) に保存されます。

BCI ファイルとは、BCI ツールで作成される圧縮ファイルの形式です。 IImage インターフェイスを使用して BCI ファイルを扱うと、 携帯電話上で簡単に圧縮画像やアニメーションの表示ができます。

詳細は、『BREW BCI ガイド』を参照してください。

      

BREW 2 Bit Tool とは ?

BREW 2 Bit Tool とは、4 ビットの BMP 形式のビットマップ (以降、ビットマップ) と 2 ビットのビットマップを変換するツールです。 このツールを使用すると、Windows に付属のペイント ツールでは作成できない 2 ビット (モノクロ 4 階調) のビットマップが作成できます。

2 ビットのビットマップを使用する利点は、画像サイズを小さくできることです。 白と黒の濃淡で画像を作成する場合に使用します。 BREW アプリで 2 ビットのビットマップを使用する場合は、 IBitmap インターフェイスを使用します。

詳細は、『BREW ユーティリティ ガイド』の「BREW 2 Bit Tool の使用」を参照してください。

      

JPEG 8bit グレースケール画像は描画できますか?

「BREW API リファレンス 2.0」には、 IImage インターフェイスにより JPEG 画像をロードできると記述されていますが、 実際にJPEG 画像をロードできるかどうかは実機に依存します。 また、その処理内容も実機により変化する可能性があります。

当社の調査では、JPEG 8bit グレースケール画像を表示すると 色が変化してしまうことを確認しております。 この現象はエミュレータおよびいくつかの実機で発生します。

グレースケール以外の JPEG 画像は正常に描画されます。 また、PNG 8bit グレースケール画像は IImage インターフェイスにより 正常に描画されます。

      

BREW で使える圧縮ファイルの形式を教えてください

IUnzipStream を使えば、gzip 形式の圧縮データを展開できます。

      

Bitmap以外の(IImageインターフェイスでのみ扱うことができる)形式の画像で、透過色は扱えますか。

WindowsBMP 以外の (IImage インターフェイスでのみ扱うことができる) 形式の画像でも、透過色は扱えます。

例として PNG 形式の画像を元に説明をします。透過モードで PNG 形式の画像をデバイスピットマップに転送するには、以下の手順を踏みます。このとき、使用する PNG 形式の画像は、透過設定をして作成してください。

[手順]

  • 1. ISHELL_LoadResImage() を使用して、リソース ファイルから PNG 形式の画像を取得します。
  • 2. IIMAGE_SetParm() の第 2 引数に IPARM_ROP を、第三引数に AEE_RO_TRANSPARENT を設定して呼び出します。これにより、イメージ画像を透過モードで扱います。
  • 3. IIMAGE_Draw() を呼び出し、デバイスビットマップにイメージ画像を描画します。
  • 4. IDISPLAY_Update() を呼び出し、画面を更新します。
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);
      

ISHELL_CreateInstance によって、アプレット構造体の m_pIDisplay メンバが表すものとは異なるオブジェクトを作成できますか?

BREW ではディスプレイ オブジェクトは 1 つしか作成することができません。このオブジェクトはアプリ起動時に自動的に作成され、アプリ実行中はこのオブジェクトを共有することになります。

      

BREW 2.0 端末で MIF ファイルのアイコンとして PNG 画像を使用する場合、透過色を設定する方法を教えてください。

アイコンに使用する PNG 画像の透過色を設定するためには、次のいずれかの画像を使用します。

  • 黒を背景色として使用した 24 ビット PNG
  • パレット 0 番を背景色として使用した 8 ビット不透過 PNG
  • 任意の透過色を背景色として使用した 8 ビット透過PNG
      

BREW の透過色と PNG 画像の背景色との関係を教えてください。

24 ビットの透過 PNG および不透過 PNG、8 ビットの不透過 PNG は、IIMAGE_Draw() により透明にはなりません。一方、8 ビットの透過 PNG で透過色が設定された場合のみ、IIMAGE_Draw() により透明になります。この際、8 ビット PNG で背景色として設定されたパレットだけが透明になります。ただしパレット 0 番が透過色として設定されていない場合、その色で描画されます。また IBITMAP_SetTransparencyColor() を呼び出しても IIMAGE_Draw() による描画には影響を与えません。

      

カメラで撮影した画像を JPEG 形式で保存しました。このファイルを読み込むにはどうしたら良いのですか?

「BREW 2.1 新インターフェイスリファレンス」によりますと、スナップショットモードを使用した場合に、ICAMERA_SetVideoEncode、ICAMERA_SetMediaData、ICAMERA_EncodeSnapshot の各関数を使用して JPEG 形式で画像を保存できるようです。

JPEG 画像をファイルから読み込み描画するには、次のようにします。

  1. IFileMgr インターフェイスを作成します。
  2. JPEG 画像をファイルから読み込みます。
  3. AEECLSID_JPEG を使用して、IImage インターフェイスを作成します。
  4. IIMAGE_Notify 関数を使用して、コールバック関数を登録します。
  5. IIMAGE_SetStream 関数を使用して、IImage インターフェイスに、ファイルから読み込んだ JPEG 画像を設定します。
  6. コールバック関数内で、IIMAGE_Draw() を使用して、JPEG 画像を描画します。

[注意] BREW SDK 2.1 のエミュレータでは、AEECLSID_JPEG が未対応のクラス ID のようです。このため、エミュレータでは JPEG 画像の表示ができないようです。

      

ICAMERA_GetFrame でビットマップ形式で取得したカメラの画像を JPEG形式に変換してファイルとして保存したいのですが、可能なのでしょうか?

機種によっては、ICAMERA_SetVideoEncode、ICAMERA_SetMediaData、ICAMERA_EncodeSnapshot の各関数を使用することで JPEG 形式のカメラ画像をファイルに保存できるようです。