2016-04-22 62 views
-1

我使用CreateDIBSection创建了一个位图并指定了.biWidth = 100; .biHeight = 100这样的伪代码:更改位图大小而不创建新的位图

pBitmapInfo->bmiHeader.biWidth = 100; 
pBitmapInfo->bmiHeader.biHeight = 100; 
.... 
CreateDIBSection(DibDC, pBitmapInfo, DIB_RGB_COLORS, 0, 0, 0); 

后,我想重用此位图,只是改变了位图尺寸大小为300x100(和可以清除旧的图像,因为我并不需要它了)。很多人说我需要用新的尺寸创建一个新的位图并删除旧的位图。但我预计在某些方面我们可以重新使用旧的位图。我不想重新创建一个新的位图,因为它会导致性能下降,而我需要重复执行多次。那么有什么方法可以在不重新创建新位图的情况下更改位图大小?

+0

如果您需要两种尺寸的位图,我会创建两个位图。调整大小可能看起来不好。您不需要重复创建任何内容,只需在需要时让每个位图“存活”即可。 –

+0

你在使用哪种环境?当然不是所有的VB/C/C++/Delphi ....我建议删除所有这些标签,并简单地添加'WinAPI'。 – Johan

+0

与字符串类似,位图是不可变的。一旦创建,它们就不能被修改。但是,您可以执行的操作是仅显示部分位图,或者使用“StretchBlt”对其进行拉伸。 – IInspectable

回答

0

如果您担心性能,继续销毁和创建位图确实不是一个好主意。

然而有一个更简单的解决方案。只需按预定义的大小创建一个位图池,并根据需要使用池中的位图。

如果你有一个长期生活DC,您可以使用:

hBitmap100x100 = CreateCompatibleBitmap(MyDC, 100,100); 
hBitmap300x300 = CreateCompatibleBitmap(MyDC, 300,300); 

如果你不断改变DC的然后使用DIB节

hBitmap100x100 = CreateDIBSection(DibDC, pBitmapInfo100x100, DIB_RGB_COLORS, null, 0, 0); 
hBitmap300x300 = CreateDIBSection(DibDC, pBitmapInfo100x100, DIB_RGB_COLORS, null, 0, 0); 

只要继续重用这一遍又一遍。
如果你愿意的话,你甚至可以在数组中放入其中的一打。
您可以在程序启动时创建它们,并在完成时处理它们。

+0

'MyDC'是一个临时资源,在执行过程中会经常变化(有时候根本不存在);这些位图必须是DIB部分,不兼容位图。 – andlabs

+0

非常感谢你Johan,我很欣赏这种替代方法。我已经初步测试,发现这种方法显着提高我的表现。在将此答案标记为最佳答案之前,我正在进行更多测试。 – DucFabulous