Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 如何将ID2D1Bitmap保存到PNG文件_Image_File_Save_Direct2d_Wic - Fatal编程技术网

Image 如何将ID2D1Bitmap保存到PNG文件

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

我在尝试将ID2D1Bitmap(从ID2D1HwndRenderTarget创建的)保存到PNG文件时遇到了一个问题。输出图像是白色的空图像。函数调用EndDraw()返回的HRESULT为-2003238894

谢谢你的帮助

这是我的密码:

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:您可以将此(人力资源检查的删除)添加为问题的注释,而不是解决方案。真正的解决办法是文森特给出的。