1

您可以使用 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);
    }
4

0 回答 0