JPEG や PNG を拡大して描画するには ?
BREW 2.1 では、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();