如何使用GDI +从资源加载图像?

时间:2009-04-26 22:39:39

标签: c++ winapi gdi+

我正在尝试将非bmp图像(在我的情况下为png)从我应用中的资源加载到Bitmap / Image实例中。由于Bitmap构造函数只有位图资源的重载,这就是我的意思:

我在全局堆上分配内存,然后将资源数据复制到其中。然后我为该全局内存块创建一个IStream(使用CreateStreamOnHGlobal)并使用获取该流的Image / Bitmap构造函数。基本上它可以工作,虽然我不确定这是最好的方法: 我注意到如果我在创建图像后释放该内存块,则不会被绘制(调用DrawImage将不会产生任何内容)。这提出了两个问题:

  1. 如何管理该内存块的生命周期?我怀疑它会因图像的破坏而被解除分配。

  2. Image / Bitmap类是否使用压缩形式的png数据,并在每次调用DrawImage时将其转换为原始数据?似乎效率很低。

  3. 任何sugestions?

2 个答案:

答案 0 :(得分:2)

使用非位图资源时,我的代码来自codeproject

IStream* pStream = NULL;
::CreateStreamOnHGlobal(m_hBuffer, FALSE, &pStream)
m_pBitmap = Gdiplus::Bitmap::FromStream(pStream);
pStream->Release();

在从流中创建位图后查看该代码,然后在流上调用Release()以删除流上的引用计数,从而将流的生命周期与Bitmap绑定。

然后你可以使用你希望管理该指针的任何机制。

答案 1 :(得分:0)

将位图转换为CachedBitmap,然后摆脱内存。