Winapi 更改位图大小而不创建新位图

Winapi 更改位图大小而不创建新位图,winapi,bitmap,Winapi,Bitmap,我使用CreateDIBSection创建了一个位图,并指定了.biWidth=100。biHeight=100,如以下伪代码所示: pBitmapInfo->bmiHeader.biWidth = 100; pBitmapInfo->bmiHeader.biHeight = 100; .... CreateDIBSection(DibDC, pBitmapInfo, DIB_RGB_COLORS, 0, 0, 0); 稍后,我想重用此位图,只需将位图大小更改为300x100(并且

我使用CreateDIBSection创建了一个位图,并指定了.biWidth=100。biHeight=100,如以下伪代码所示:

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

稍后,我想重用此位图,只需将位图大小更改为300x100(并且可能会清除旧图像,因为我不再需要它)。很多人说,我需要创建一个新的位图和新的大小,并删除旧的位图。但我希望在某种程度上,我们可以重新使用旧的位图。我不想重新创建一个新的位图,因为它会导致性能下降,而我需要重复多次。那么,有没有办法在不重新创建新位图的情况下更改位图大小?

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

然而,有一个更容易的解决办法。只需创建预定义大小的位图池,并根据需要使用池中的位图

如果您有长寿命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);
只要不断重复使用这些工具。
如果您愿意,您甚至可以在一个阵列中放置十几个。

您可以在程序启动时创建它们,并在完成后处理它们

如果你需要两种尺寸的位图,我会创建两个位图。调整大小可能看起来很糟糕。您不需要重复创建任何内容,只要让每个位图“活动”就可以了。您使用的是哪种环境?当然不是所有的VB/C/C++/Delphi。。。。我建议删除所有这些标记,只需添加
WinAPI
。像字符串一样,位图是不可变的。一旦创建,它们就无法修改。但是,您可以只显示位图的一部分,或者使用
StretchBlt
@UliGerhardt拉伸它,因为位图的大小在宽度和高度上都会随机变化。我无法创建上千个不同大小的位图,让它们在我需要的时候一直存在。
MyDC
是一个临时资源,在执行过程中会经常更改(有时根本不存在);这些位图必须是DIB部分,而不是兼容的位图。非常感谢Johan,我非常感谢这种替代方法。我已经进行了初步测试,发现这种方法显著提高了我的性能。在把这个答案标为最佳答案之前,我正在做更多的测试。