Image 如何将ID2D1Bitmap保存到PNG文件
我在尝试将ID2D1Bitmap(从ID2D1HwndRenderTarget创建的)保存到PNG文件时遇到了一个问题。输出图像是白色的空图像。函数调用EndDraw()返回的HRESULT为-2003238894 谢谢你的帮助 这是我的密码:Image 如何将ID2D1Bitmap保存到PNG文件,image,file,save,direct2d,wic,Image,File,Save,Direct2d,Wic,我在尝试将ID2D1Bitmap(从ID2D1HwndRenderTarget创建的)保存到PNG文件时遇到了一个问题。输出图像是白色的空图像。函数调用EndDraw()返回的HRESULT为-2003238894 谢谢你的帮助 这是我的密码: HRESULT CImageUtil::SaveBitmapToFile(PCWSTR uri,ID2D1Bitmap* pBitmap,ID2D1RenderTarget* pRenderTarget) { HRESULT hr = S_OK; I
HRESULT CImageUtil::SaveBitmapToFile(PCWSTR uri,ID2D1Bitmap* pBitmap,ID2D1RenderTarget* pRenderTarget)
{
HRESULT hr = S_OK;
ID2D1Factory *pD2DFactory = NULL;
IWICBitmap *pWICBitmap = NULL;
ID2D1RenderTarget *pRT = NULL;
IWICBitmapEncoder *pEncoder = NULL;
IWICBitmapFrameEncode *pFrameEncode = NULL;
IWICStream *pStream = NULL;
if (SUCCEEDED(hr))
{
hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pD2DFactory);
}
//
// Create IWICBitmap and RT
//
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 = pD2DFactory->CreateWicBitmapRenderTarget(
pWICBitmap,
rtProps,
&pRT
);
}
if (SUCCEEDED(hr))
{
//
// Render into the bitmap
//
pRT->BeginDraw();
pRT->Clear(D2D1::ColorF(D2D1::ColorF::White));
pRT->DrawBitmap(pBitmap);
pRT->EndDraw();
}
if (SUCCEEDED(hr))
{
//
// Save image to file
//
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();
}
SafeRelease(&pD2DFactory);
SafeRelease(&pWICBitmap);
SafeRelease(&pRT);
SafeRelease(&pEncoder);
SafeRelease(&pFrameEncode);
SafeRelease(&pStream);
return hr;
}
您怎么知道自己是否有错误,因为您只是接受错误并继续,而不是记录错误的来源?您会得到一个非零的hresult,因此首先通过在每次函数调用后添加printf或fprintf来确定它来自哪个函数。在这个街区你有一个明显的遗漏:
if (SUCCEEDED(hr))
{
//
// Render into the bitmap
//
pRT->BeginDraw();
pRT->Clear(D2D1::ColorF(D2D1::ColorF::White));
pRT->DrawBitmap(pBitmap);
pRT->EndDraw();
}
if (SUCCEEDED(hr))
你不必费心在任何地方分配人力资源,所以你甚至不知道他们中是否有人出错。显然,Clear()和最终的png编写工作正常,因为您得到了一个好文件,所以DrawBitmap或其中一个位图创建调用失败。是的,当我这样编写代码时:pRT->DrawBitmap(pBitmap);hr=pRT->EndDraw()然后hr=-2003238894。这意味着调用会出错。如果我注释掉行pRT->DrawBitmap(…),那么hr=S_OK。我猜这是因为我绘制了不兼容的位图。我使用WIC渲染目标绘制Hwnd渲染目标的位图。但我不知道如何修复它。我在这里查找了您的错误代码:(0x88990012=D2DERR\u error\u FACTORY)。问题似乎是pBitmap和pRT不是从同一ID2D1Factory对象创建的。非常感谢,您的答复非常有用,我使用不同的factory时出错了。问题现在已经解决了。@SilverbackNet:您可以将此(人力资源检查的删除)添加为问题的注释,而不是解决方案。真正的解决办法是文森特给出的。