void CDemoView::SaveImageToFile(CD2DBitmap* pBitmap, const CString& strFilePath, GUID containerFormat)
{
if (!pBitmap)
AfxThrowOleException(E_FAIL);
// Get global Direct2D and WIC factories
_AFX_D2D_STATE* pD2DState = AfxGetD2DState();
ID2D1Factory* pD2DFactory = pD2DState->GetDirect2dFactory();
IWICImagingFactory* pWICFactory = pD2DState->GetWICFactory();
if (!pD2DFactory || !pWICFactory)
AfxThrowOleException(E_FAIL);
// Create a WIC bitmap
const CD2DSizeF size = pBitmap->GetSize();
const UINT nWidth = static_cast<UINT>(size.width);
const UINT nHeight = static_cast<UINT>(size.height);
CComPtr<IWICBitmap> spWicBitmap;
HRESULT hr = pWICFactory->CreateBitmap(nWidth, nHeight,
GUID_WICPixelFormat32bppPBGRA, WICBitmapCacheOnLoad, &spWicBitmap);
ATLENSURE_SUCCEEDED(hr);
// Create a Direct2D render target that renders to a WIC bitmap
ID2D1RenderTarget* pRenderTarget = NULL;
hr = pD2DFactory->CreateWicBitmapRenderTarget(spWicBitmap,
&D2D1::RenderTargetProperties(D2D1_RENDER_TARGET_TYPE_SOFTWARE,
D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED),
0.f, 0.f, D2D1_RENDER_TARGET_USAGE_NONE),
&pRenderTarget);
ATLENSURE_SUCCEEDED(hr);
// Draw the Direct2D bitmap into created WIC bitmap render target
CRenderTarget renderTarget;
renderTarget.Attach(pRenderTarget);
renderTarget.BeginDraw();
renderTarget.DrawBitmap(pBitmap, CD2DRectF(0, 0, size.width, size.height));
hr = renderTarget.EndDraw();
ATLENSURE_SUCCEEDED(hr);
// Use WIC stuff to save the WIC bitmap into a file
CComPtr<IWICStream> spStream;
hr = pWICFactory->CreateStream(&spStream);
ATLENSURE_SUCCEEDED(hr);
hr = spStream->InitializeFromFilename(strFilePath, GENERIC_WRITE);
ATLENSURE_SUCCEEDED(hr);
CComPtr<IWICBitmapEncoder> spEncoder;
hr = pWICFactory->CreateEncoder(containerFormat, NULL, &spEncoder.p);
ATLENSURE_SUCCEEDED(hr);
hr = spEncoder->Initialize(spStream, WICBitmapEncoderNoCache);
ATLENSURE_SUCCEEDED(hr);
CComPtr<IWICBitmapFrameEncode> spFrameEncode;
hr = spEncoder->CreateNewFrame(&spFrameEncode, NULL);
ATLENSURE_SUCCEEDED(hr);
hr = spFrameEncode->Initialize(NULL);
ATLENSURE_SUCCEEDED(hr);
hr = spFrameEncode->SetSize(nWidth, nHeight);
ATLENSURE_SUCCEEDED(hr);
WICPixelFormatGUID pixelFormat = GUID_WICPixelFormatDontCare;
hr = spFrameEncode->SetPixelFormat(&pixelFormat);
ATLENSURE_SUCCEEDED(hr);
hr = spFrameEncode->WriteSource(spWicBitmap, NULL);
ATLENSURE_SUCCEEDED(hr);
hr = spFrameEncode->Commit();
ATLENSURE_SUCCEEDED(hr);
hr = spEncoder->Commit();
ATLENSURE_SUCCEEDED(hr);
}