-1

我一直在使用WINAPI CreateDIBSection()逐像素绘制,然后我将其 bitblt 到 DC。我很好奇。CreateDIBSection 的底层数据结构是怎么回事?BITMAPINFO 结构存储屏幕/客户端的宽度高度。然后是 VOID **ppvBits,处理 24 位颜色。那么这一切都可以看作是一个 3D 数组吗?与此类似

整数像素[高度][宽度][颜色]

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

微软是如何如此快速高效地获得这种方法的?我什么都试过了。Int*** 指向指针的指针,, int*** malloc,尝试NEW等,它们在大型数组上都非常慢。我只是好奇如何构建一个性能也很好的 3D 数组。有什么想法吗?

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

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

4

1 回答 1

1

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

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

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

您可以使用GetDibBits直接访问位

另请参阅:位图格式

于 2015-07-07T20:24:28.797 回答