Можете ли вы использовать метод CreateSharedBitmap для создания общего растрового изображения без IDXGIDevice?
моя цель рендеринга src — hwndrendertarget.
По сути, я хочу сохранить изображение из hwndrendertarget.
Это то, что я пытался.
Спасибо
HRESULT bitmapToFile::SaveBitmapToFile(PCWSTR uri,ID2D1Bitmap* pBitmap,ID2D1RenderTarget* pRenderTarget)
{
HRESULT hr = S_OK;
ID2D1Bitmap *m_pBitmap1= NULL;
IWICBitmap *pWICBitmap = NULL;
ID2D1RenderTarget *pRT = NULL;
IWICBitmapEncoder *pEncoder = NULL;
IWICBitmapFrameEncode *pFrameEncode = NULL;
IWICStream *pStream = NULL;if (SUCCEEDED(hr))
{
// Create a WIC factory.
hr=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))
{
WICPixelFormatGUID format = GUID_WICPixelFormat32bppPBGRA;
hr = m_pWICFactory->CreateBitmap(
sc_bitmapWidth,
sc_bitmapHeight,
format,
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.usage = D2D1_RENDER_TARGET_USAGE_NONE;
rtProps.type = D2D1_RENDER_TARGET_TYPE_DEFAULT;
/*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,
&pRT
);
D2D1_BITMAP_PROPERTIES bp2 = D2D1::BitmapProperties();
/*bp.pixelFormat = rtProps.pixelFormat;*/
bp2.pixelFormat = PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED);
bp2.dpiX = bp2.dpiY = 0.0f;
hr=pRT->CreateSharedBitmap(
__uuidof(IWICBitmap),
static_cast<void*>(pWICBitmap),
&bp2,
&m_pBitmap1
);
hr=m_pBitmap1->CopyFromRenderTarget(nullptr, pRenderTarget, nullptr);
}
Задача ещё не решена.