MFC から SVG クラスの画像呼び出しコードサンプル
MFC(GDI+) ではリソースや指定アドレスなどから取得したり、生成して描いたりした画像オブジェクトを表示するだけになります。
サンプルコードでは任意のフォルダに配置された画像ファイルを読み込む形にしてあります。
MFC(GDI+) の場合以下のようになります。
Gdiplus::Bitmap* pBitmap =
::new Gdiplus::Bitmap(L"C:\\Users\\Public\\Pictures\\sample.png");
// 左上、右上、左下の3点をDrawImageに渡す
Gdiplus::Point ptDest[3];
ptDest[0] = Gdiplus::Point(200, 100);
ptDest[1] = Gdiplus::Point(200, 200);
ptDest[2] = Gdiplus::Point(100, 100);
pGraphics->DrawImage(pImage, ptDest, 3);
::delete pBitmap;
MFC(GDI+) のサンプルコードにあるとおり、3点を移動することで画像の回転を行う形にしてあります。
よって、 SvgImage::AddImage 関数で指定する表示座標は左上のポイントとなります。
読み込んだ画像はエンコードしてストリーミングデータにしてから SvgImage に渡しています。
サンプルコードは PNG 形式から読み込んでいますが、読み込み後に BITMAP 形式で保持されます。
そのため、ストリーミングにする前にエンコード処理が必要です。
エンコードからストリーミングまでを一度に行うため、 MFC(GDI+) と比較してコードが長くなっています。
SvgImage に書き出すと以下のようになります。
Gdiplus::Bitmap* pBitmap =
::new Gdiplus::Bitmap(L"C:\\Users\\Public\\Pictures\\sample.png");
IStream* pStream;
CreateStreamOnHGlobal(NULL, FALSE, &pStream);
Gdiplus::EncoderParameters* pEP = (Gdiplus::EncoderParameters*)malloc(sizeof(
Gdiplus::EncoderParameters) + 1 * sizeof(Gdiplus::EncoderParameter));
pEP->Count = 2;
pEP->Parameter[0].Guid = Gdiplus::EncoderColorDepth;
pEP->Parameter[0].NumberOfValues = 1;
pEP->Parameter[0].Type = Gdiplus::EncoderParameterValueTypeLong;
ULONG colordepth = 32;
pEP->Parameter[0].Value = &colordepth;
pEP->Parameter[1].Guid = Gdiplus::EncoderCompression;
pEP->Parameter[1].NumberOfValues = 1;
pEP->Parameter[1].Type = Gdiplus::EncoderParameterValueTypeLong;
ULONG compression = Gdiplus::EncoderValueCompressionLZW;
pEP->Parameter[1].Value = &compression;
pBitmap->Save(pStream, &(pImageCodecInfo + i)->Clsid, pEP);
free(pEP);
HGLOBAL hGlobal;
DWORD dwSize = (DWORD) GlobalSize(hGlobal);
LPBYTE pGlobal = (LPBYTE)GlobalLock(hGlobal);
CPoint pn = CPoint(200, 100);
pSvgImage->AddImage(pn, pGlobal, dwSize, pBitmap->GetWidth(), pBitmap->GetHeight(),
200, 100, 0);
// ストリームの後処理
pStream->Release();
GlobalUnlock(hGlobal);
GlobalFree(hGlobal);
::delete pBitmap;