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 25

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

Last updated at Posted at 2022-12-24

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

ブラシはグラフ座標に合わせて上下反転する必要があります。
今回は 180 度回転で上下反転に対応させます。

MFC(GDI+) の場合以下のようになります。

	Gdiplus::Bitmap* pBitmap = 
        ::new Gdiplus::Bitmap(L"C:\\Users\\Public\\Pictures\\sample.png");
	Gdiplus::TextureBrush* pBrush = NULL;
    pBrush = ::new Gdiplus::TextureBrush(pBitmap);
    pBrush->RotateTransform(180.0f, Gdiplus::MatrixOrderPrepend);
    Gdiplus::RectF rect(0, 0, 500, 500);
	pGraphics->FillRectangle(pBrush, rect);
    ::delete pBrush;

SvgImage への書き出しは「MFC から SVG クラスの画像呼び出しコードサンプル」と同様に画像を読み込みストリーミング変換するためコードが長くなります。
画像の書き出しも同様の処理ですのでストリーミングへの変換関数などを用意しておけば MFC(GDI+) と同程度のコード量になります。

SvgImage に書き出すと以下のようになります。

	Gdiplus::Bitmap* pBitmap =
             ::new Gdiplus::Bitmap(L"C:\\Users\\Public\\Pictures\\sample.png");

	mdStream* pStream;
	CreateStreamOnHGlobal(NULL, FALSE, &pStream);
	// PNG形式/32ビットカラー/LZW圧縮で保存する
	CLSID	clsid;
	GetEncoderClsid(_T("image/png"), &clsid);
	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, &clsid, pEP);
	free(pEP);
	HGLOBAL hGlobal;
	GetHGlobalFromStream(pStream, &hGlobal);
	DWORD dwSize = (DWORD)GlobalSize(hGlobal);
	LPBYTE pGlobal = (LPBYTE)GlobalLock(hGlobal);
	CString strName = pSvgImage->AddImagePattern(pGlobal, dwSize, 
                pBitmap->GetWidth(), pBitmap->GetHeight,
                 1.0f, 1.0f, CPoint(0, 0) , 180);

	// ストリームの後処理
	pStream->Release();
	GlobalUnlock(hGlobal);
	GlobalFree(hGlobal);
    ::delete pBitmap;

	CString strPatternUrl;
	strPatternUrl.Format(L"url(#%s)", (LPCTSTR)strPatternName);

	pSvgImage->AddPolygon(lpPoints, nCount);
	pSvgImage->AddAttrFillUrl(strNamel);
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?