0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

MFCからSVG変換Advent Calendar 2022

Day 22

MFC から SVG クラスの画像呼び出しコードサンプル

Last updated at Posted at 2022-12-21

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;
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?