Aliens 2024-05-10 14:13 采纳率: 50%
浏览 12
已结题

CreateBitmapFromWicBitmap内存释放问题。

d2d程序,需要通过文件加载图片,发现内存占用不断增大,好像不能立即释放。加载一个比较大的图片时,执行到语句pRenderTarget->CreateBitmapFromWicBitmap(),内存就会增加大约10M,每次加载一次图片,内存就增加一些,好像不会释放,测试了十几次内存占用达到500M左右。即便最后增加了 wicBitmapDecoder.Release(),wicFrameDecode.Release(), wicConverter.Release()也不起作用。
网上也有人遇到改问题,https://segmentfault.com/q/1010000004380144?bd_source_light=4746641,但是尝试将pRenderTarget Release后也还是不起作用。

HRESULT LoadStreamToBitmap(ID2D1RenderTarget* pRenderTarget, IStream* pStream, ID2D1Bitmap** ppBitmap)
{
    CComPtr<IWICBitmapDecoder> wicBitmapDecoder;
    CComPtr<IWICBitmapFrameDecode> wicFrameDecode;
    CComPtr<IWICFormatConverter> wicConverter;
    
    //从图像流创建解码器 
    HRESULT hr;
    HR(hr = theApp.m_pWICFactory->CreateDecoderFromStream(
        pStream,
        nullptr,
        WICDecodeMetadataCacheOnLoad,
        &wicBitmapDecoder)
    );
    
    // 获取解码器的第一帧
    HR(wicBitmapDecoder->GetFrame(0, &wicFrameDecode));

    HR(theApp.m_pWICFactory->CreateFormatConverter(&wicConverter));
    
    HR(wicConverter->Initialize(
        wicFrameDecode,
        GUID_WICPixelFormat32bppPBGRA,//即图片每个像素使用32位存储,图片透明度设置为0.0,即图片不透明。
        WICBitmapDitherTypeNone,
        nullptr,
        0.0f,
        WICBitmapPaletteTypeMedianCut)//WICBitmapPaletteTypeCustom?
    );
    
    //创建 ID2D1Bitmap 对象,该对象可通过呈现器目标绘制并与其他 Direct2D 对象一起使用
    //create a Direct2D bitmap from the WIC bitmap.
    HR(pRenderTarget->CreateBitmapFromWicBitmap(
        wicConverter,
        nullptr,
        ppBitmap)
    );
    
    return S_OK;
}

  • 写回答

19条回答 默认 最新

  • 专家-皆知 2024-05-10 14:13
    关注

    确保正确管理和释放COM对象,使用智能指针或手动调用Release。

    以上回复有部分引自免费微信小程序:皆我百晓生。 如问题尚未解决,还请稍待,如有疑问请回复进一步沟通。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月13日
  • 创建了问题 5月10日

悬赏问题

  • ¥15 marlin编译错误,如何解决?
  • ¥15 有偿四位数,节约算法和扫描算法
  • ¥15 VUE项目怎么运行,系统打不开
  • ¥50 pointpillars等目标检测算法怎么融合注意力机制
  • ¥15 关于超局变量获取查询的问题
  • ¥20 Vs code Mac系统 PHP Debug调试环境配置
  • ¥60 大一项目课,微信小程序
  • ¥15 求视频摘要youtube和ovp数据集
  • ¥15 在启动roslaunch时出现如下问题
  • ¥15 汇编语言实现加减法计算器的功能