【问题标题】:Wrong render target ID2D1Bitmap错误的渲染目标 ID2D1Bitmap
【发布时间】:2014-07-24 23:47:47
【问题描述】:

我正在尝试根据How to save ID2D1Bitmap to PNG file 保存一个 ID2D1Bitmap,但与他不同的是 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;
}

【问题讨论】:

标签: c++ visual-c++ mfc direct2d wic


【解决方案1】:

主要问题是使用默认渲染属性创建的渲染目标(源 ID2D1RenderTarget 和目标 WIC 渲染目标)。根据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 渲染成功绘制源位图之后。

【讨论】:

    猜你喜欢
    • 2020-09-17
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    相关资源
    最近更新 更多