【问题标题】:CreateDIBSection under the hood在引擎盖下创建 DIBSection
【发布时间】:2015-07-08 05:21:39
【问题描述】:

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

int 像素[高度][宽度][颜色]?

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

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

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

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

【问题讨论】:

  • 你到底在说什么“真的很慢”?分配?以某种方式使用内存?除了在某些特殊情况下(例如 DirectX 从视频复制到系统 RAM),内存通常是内存 - 无论是由 CreateDIBSection 还是由 malloc 分配的。
  • 您分配的内存过多。一个类似的数组将是 900*1800*3,因为对于每个像素,您有 3 个字节(如果您有 alpha,则为 4 个字节,加上每行末尾的一些字节用于对齐)。它不是 3D 数组,而是颜色值的 2D 数组。

标签: c++ winapi createdibsection


【解决方案1】:

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

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

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

您可以使用GetDibBits 直接访问位

另见:bitmap format

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 2017-06-02
    • 2018-03-03
    相关资源
    最近更新 更多