2009-04-26 93 views
3

我想从我的应用程序中的资源加载一个非BMP图像(在我的情况下,PNG)到一个位图/图像实例。由于位图构造函数只对位图资源负载过重,所以我这样做了:如何使用GDI +从资源加载图像?

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

  1. 如何管理该内存块的生存期?我怀疑它会在图像被破坏时被释放。

  2. Image/Bitmap类是否使用压缩格式的png数据,并在每次调用DrawImage时将其转换为原始数据?看起来非常没有效率。

任何消耗?

回答

0

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

+0

CachedBitmap的问题在于它不能从Image继承,所以需要将其与“常规”位图区别对待。 我已经设法解决内存使用寿命问题,fortunatlly图像有一个虚拟的解构器,所以它很简单。但是,我仍然不确定这是否正确。 – Meat 2009-04-27 14:09:11

2

当使用非位图资源时,我的代码基于codeproject

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

望着那代码一旦你从流做一个创建位图,那么你就流呼吁Release()对流删除您的引用计数,从而追平了流的位图的寿命。

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