在引擎盖下创建DIBSection

时间:2015-07-07 20:01:25

标签: c++ winapi createdibsection

我一直在使用WINAPI CreateDIBSection()逐个像素地绘制然后我bitblt到DC。我很好奇。 CreateDIBSection的底层数据结构发生了什么? BITMAPINFO结构存储屏幕/客户端的宽度高度。然后VOID ** ppvBits处理24位颜色。所有这些都可以看作3D阵列吗?与此相似

int pixels [height] [width] [color]

我问的原因是这个CreateDIBSection()函数非常快,但是如果我创建一个类似的数组(900 * 1800 *(246 * 256 * 256)),那真的很慢。

Microsoft如何快速有效地使用此方法?我已经尝试了一切。 Int ***指针指向指针int*** malloc,尝试NEW等,它们在大型数组上都非常慢。我只是好奇我如何构建一个同样表现的3D数组。有什么想法吗?

我需要一个大约20000x1800x100000的阵列。 CreateDIBSection()快速存储,没有任何问题。但是标准的C / C ++动态数组呢?

我需要在第二个数组中存储CreateDIBSection()BITMAPINFO中的内容。

1 个答案:

答案 0 :(得分:1)

它不使用三维数组。它只需要一维的颜色数组。您可以从索引中获取XY坐标,并了解位图的宽度。

row = index / width;
column = index % width;

对于24位颜色,dib的大小为width * height * 3 bytes(每种颜色一个字节)。当它被加载到内存中时,它会被填充到4个字节(整数大小)。

您可以使用GetDibBits直接访问位

另请参阅:bitmap format