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

BREW FAQ : JPEG や PNG を拡大して描画するには?

JPEG や PNG を拡大して描画するには?

JPEG や PNG の拡大、縮小はサポートされていません。

ビットマップの拡大、縮小はサポートされています。

そこで、JPEG や PNG を拡大して描画する場合はビットマップに画像を描画し、ITRANSFORM_TransformBltComplex() や ITRANSFORM_TransformBltSimple() を使用します。

SophiaFramework では、 SFBTransform::TransformBltSimple 関数や SFBTransform::TransformBltComplex 関数を使用して、ビットマップに描画後の PNG イメージを拡大します。

以下のサンプルコードでは、 PNG イメージをリソースファイルから読み込み、 2 倍に拡大して表示します。

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

// リソース ファイルから読み込む PNG イメージのリソース ID
#define IDP_MY_PICTURE  0x0001


IShell*         shell       = app->a.m_pIShell;
IDisplay*       display     = app->a.m_pIDisplay;
IImage*         pngimg      = NULL;
IBitmap*        tmpBmp      = NULL;
IBitmap*        dst         = NULL;
ITransform*     trans       = NULL;
AEEImageInfo    info        = {0};

// リソース ファイルから PNG イメージを読み込みます。
pngimg = ISHELL_LoadResImage(shell, MYRESOURCE_RES_FILE, IDP_MY_PICTURE);

if (pngimg != NULL) {
    // PNG イメージの情報を取得します。
    IIMAGE_GetInfo(pngimg, &info);

    // 一時保存用のビットマップを作成します。
    IDISPLAY_GetDeviceBitmap(display, &dst);
    IBITMAP_CreateCompatibleBitmap(dst, &tmpBmp, info.cx, info.cy);
    // 描画先のビットマップを設定します。
    IDISPLAY_SetDestination(display, tmpBmp);

    // 一時保存用のビットマップに描画します。
    IIMAGE_Draw(pngimg, 0, 0);

    // 描画先のビットマップをデフォルトに戻します。
    IDISPLAY_SetDestination(display, NULL);

    // ITransform インターフェイスを取得します。
    IBITMAP_QueryInterface(dst, AEECLSID_TRANSFORM, &trans);
    // 一時保存用のビットマップに描画した画像を、2 倍に拡大してデバイス画面に描画します。
    ITRANSFORM_TransformBltSimple(trans, 0, 0, tmpBmp, 0, 0, info.cx, info.cy, TRANSFORM_SCALE_2, COMPOSITE_OPAQUE);

    // インターフェイスを破棄します。
    ITRANSFORM_Release(trans);
    IBITMAP_Release(tmpBmp);
    IBITMAP_Release(dst);
    IIMAGE_Release(pngimg);
}

// 画面を更新します。
IDISPLAY_Update(display);

[ SophiaFramework を使用したコード ]

// リソース ファイルから読み込む PNG イメージのリソース ID
#define IDP_MY_PICTURE  0x0001

SFBShellSmp      shell   = SFBShell::GetInstance();
SFBDisplaySmp    display = SFBDisplay::GetInstance();
SFBImageSmp      pngimg;
SFBBitmapSmp     tmpBmp;
SFBBitmapSmp     dst;
SFBTransformSmp  trans;
AEEImageInfo     info    = {0};

// リソース ファイルから PNG イメージを読み込みます。
pngimg = shell->LoadResImage(MYRESOURCE_RES_FILE, IDP_MY_PICTURE);

if (pngimg != NULL) {
    // PNG イメージの情報を取得します。
    pngimg->GetInfo(&info);

    // 一時保存用のビットマップを作成します。
    display->GetDeviceBitmap(&dst);
    dst->CreateCompatibleBitmap(&tmpBmp, info.cx, info.cy);
    // 描画先のビットマップを設定します。
    display->SetDestination(tmpBmp);

    // 一時保存用のビットマップに描画します。
    pngimg->Draw(0, 0);

    // 描画先のビットマップをデフォルトに戻します。
    display->ResetDestination();

    // SFBTransform インスタンスを生成します。
    trans = SFBTransform::NewInstance(dst);
    // 一時保存用のビットマップに描画した画像を、2 倍に拡大してデバイス画面に描画します。
    trans->TransformBltSimple(0, 0, tmpBmp, 0, 0, info.cx, info.cy, TRANSFORM_SCALE_2, COMPOSITE_OPAQUE);
}

// 画面を更新します。
display->Update();