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