我一直在使用WinAPI的
CreateDIBSection()
逐像素绘制,然后我BitBlt()
到DC。我很好奇。 CreateDIBSection
的底层数据结构是怎么回事? BITMAPINFO
结构体存储屏幕/客户端的宽度和高度。然后 VOID **ppvBits
处理 24 位颜色。那么这一切可以看作是一个 3D 数组吗?与此类似:
int pixels[height][width][color];
我问的原因是
CreateDIBSection()
函数非常非常快,但如果我创建一个类似的 (900 * 1800 * (246*256*256)) 数组,它真的非常慢。
微软是如何做到如此快速高效的这种方法的?我已经尝试了一切:
int***
指针到指针,int*** malloc()
,尝试过new
等,它们在大型数组上都非常慢。我只是好奇如何构造一个性能同样好的 3D 数组。有什么想法吗?
我需要一个大约 20000x1800x100000 的数组。
CreateDIBSection()
可以毫无问题地快速存储它。但是标准 C/C++ 动态数组怎么样?
我需要将
CreateDIBSection()
和 BITMAPINFO
中的内容存储在第二个数组中。
它不使用 3 维数组。它只需要一个一维颜色数组。您可以从索引中获取
X
和 Y
坐标并了解位图的宽度。
row = index / width;
column = index % width;
对于 24 位颜色,dib 的大小为
width * height * 3 bytes
(每种颜色一个字节)。当它加载到内存中时,它会被填充到 4 个字节(整数大小)。
您可以使用GetDibBits直接访问位
另请参阅:位图格式