Я пытаюсь сохранить ID2D1Bitmap на основе этого Как сохранить ID2D1Bitmap в файл PNG но в отличие от него в hr = pRT2-> EndDraw (); мой час = -2003238891. что означает D2DERR_WRONG_RESOURCE_DOMAIN. Как использовать исходную цель рендеринга (pRenderTarget), чтобы это исправить?
bitmapToFile.cpp
HRESULT bitmapToFile::SaveBitmapToFile(PCWSTR uri,ID2D1Bitmap* pBitmap,ID2D1RenderTarget* pRenderTarget)
{
HRESULT hr = S_OK;
IWICBitmap *pWICBitmap = NULL;
ID2D1RenderTarget *pRT2 = NULL;
IWICBitmapEncoder *pEncoder = NULL;
IWICBitmapFrameEncode *pFrameEncode = NULL;
IWICStream *pStream = NULL;
if (SUCCEEDED(hr))
{
// Create a WIC factory.
CoCreateInstance(
CLSID_WICImagingFactory,
NULL,
CLSCTX_INPROC_SERVER,
IID_IWICImagingFactory,
reinterpret_cast<void **>(&m_pWICFactory)
);
}
UINT sc_bitmapWidth = pBitmap->GetSize().width;
UINT sc_bitmapHeight = pBitmap->GetSize().height;
if (SUCCEEDED(hr))
{
hr = m_pWICFactory->CreateBitmap(
sc_bitmapWidth,
sc_bitmapHeight,
GUID_WICPixelFormat32bppPBGRA,
WICBitmapCacheOnLoad,
&pWICBitmap
);
}
if (SUCCEEDED(hr))
{
D2D1_RENDER_TARGET_PROPERTIES rtProps = D2D1::RenderTargetProperties();
rtProps.pixelFormat = D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED);
rtProps.type = D2D1_RENDER_TARGET_TYPE_DEFAULT;
rtProps.usage = D2D1_RENDER_TARGET_USAGE_NONE;
hr = m_pD2DFactory2->CreateWicBitmapRenderTarget(
pWICBitmap,
rtProps,
&pRT2
);
}
if (SUCCEEDED(hr))
{
pRT2->BeginDraw();
pRT2->Clear();
pRT2->DrawBitmap(pBitmap);
hr=pRT2->EndDraw();
}
if (SUCCEEDED(hr))
{
hr = m_pWICFactory->CreateStream(&pStream);
}
WICPixelFormatGUID format = GUID_WICPixelFormat32bppPBGRA;
if (SUCCEEDED(hr))
{
hr = pStream->InitializeFromFilename(uri, GENERIC_WRITE);
}
if (SUCCEEDED(hr))
{
hr = m_pWICFactory->CreateEncoder(GUID_ContainerFormatPng, NULL, &pEncoder);
}
if (SUCCEEDED(hr))
{
hr = pEncoder->Initialize(pStream, WICBitmapEncoderNoCache);
}
if (SUCCEEDED(hr))
{
hr = pEncoder->CreateNewFrame(&pFrameEncode, NULL);
}
if (SUCCEEDED(hr))
{
hr = pFrameEncode->Initialize(NULL);
}
if (SUCCEEDED(hr))
{
hr = pFrameEncode->SetSize(sc_bitmapWidth, sc_bitmapHeight);
}
if (SUCCEEDED(hr))
{
hr = pFrameEncode->SetPixelFormat(&format);
}
if (SUCCEEDED(hr))
{
hr = pFrameEncode->WriteSource(pWICBitmap, NULL);
}
if (SUCCEEDED(hr))
{
hr = pFrameEncode->Commit();
}
if (SUCCEEDED(hr))
{
hr = pEncoder->Commit();
}
return hr;
}
Основная проблема заключается в том, что оба объекта рендеринга (исходный ID2D1RenderTarget и целевой WIC rendertarget) созданы со свойствами рендеринга по умолчанию. В соответствии с https://msdn.microsoft.com/en-us/library/windows/desktop/dd756757(v=vs.85).aspx#sharing_render_target_resources ресурсы не могут быть разделены между целями со свойствами по умолчанию, так как неизвестно, где будет отображаться растровое изображение. Так что в моем случае я создал обе цели с этими свойствами:
auto rtProps = D2D1::RenderTargetProperties();
rtProps.type = D2D1_RENDER_TARGET_TYPE_SOFTWARE;
rtProps.usage = D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE;
После этого рендер WIC успешно рисует исходное растровое изображение.