image - 如何将 ID2D1Bitmap 保存为 PNG 文件

标签 image file save direct2d wic

尝试将 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 来找出它来自哪个函数。并且您在该 block 中有一个明显的遗漏:

if (SUCCEEDED(hr))
{
    //
    // Render into the bitmap
    //
    pRT->BeginDraw();

pRT->Clear(D2D1::ColorF(D2D1::ColorF::White));


pRT->DrawBitmap(pBitmap);

    pRT->EndDraw();
}
if (SUCCEEDED(hr))

您不必费心将 hr 分配到其中的任何位置,因此您甚至不知道其中是否有任何错误。显然,Clear() 和最终的 png 写入工作正常,因为您获得了一个好的文件,因此是 DrawBitmap 或位图创建调用之一失败了。

关于image - 如何将 ID2D1Bitmap 保存为 PNG 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11447489/

相关文章:

python - close() Python 中的一个变量

Javascript:将 Canvas 另存为图像==> "Uncaught TypeError: undefined is not a function"

ios - 将图像裁剪为 1 :1 and then resizing it

cs50 pset5 为什么我的图像恢复程序只能恢复 50 个图像中的 49 个?

php - 如何使用 laravel 处理 mysql 中的大型更新查询

java - 将 JPanel 保存为图像(不是文件,而是变量)

android - 在内部存储中保存和获取图像 url

python - 模块'对象没有属性 'drawMatches' opencv python

jQuery onResize 图像定位问题

c# - 许多 C# 解决方案的代码行计数