CreateDIBSection() 在幕后

问题描述 投票:0回答:1

我一直在使用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
中的内容存储在第二个数组中。

c++ winapi createdibsection
1个回答
1
投票

它不使用 3 维数组。它只需要一个一维颜色数组。您可以从索引中获取

X
Y
坐标并了解位图的宽度。

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

对于 24 位颜色,dib 的大小为

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

您可以使用GetDibBits直接访问位

另请参阅:位图格式

© www.soinside.com 2019 - 2024. All rights reserved.