【问题标题】:CreatePatternBrush and screen color depthCreatePatternBrush 和屏幕颜色深度
【发布时间】:2011-02-27 21:06:09
【问题描述】:

我正在使用 CreatePatternBrush 创建一个画笔和一个用 CreateBitmap 创建的位图。

位图宽 1 像素,高 24 像素,我有每个像素的 RGB 值,所以我创建了一个 rgbquads 数组并将其传递给 CreateBitmap。

当屏幕颜色深度为 32bpp 时,这可以正常工作,因为我创建的位图也是 32bpp。

当屏幕颜色深度不是 32bpp 时,这会失败,我明白为什么会这样,因为我应该创建一个兼容的位图。

看来我应该改用 CreateCompatibleBitmap,但是如何将我拥有的像素数据放入该位图中?

我还阅读了有关 CreateDIBPatternBrushPt、CreateDIBitmap、CreateDIBSection 等的信息。

我不明白什么是 DIBSection,并且发现这个主题通常令人困惑。

我知道我需要一个与屏幕颜色深度相同的位图,但是如何创建只有 32bpp 像素数据的位图?

【问题讨论】:

    标签: windows api gdi


    【解决方案1】:

    您可以创建 DIB,因为您可以使用独立于屏幕颜色深度的设备独立位图。见CreateDIBSection()

    如何创建只有 32bpp 像素数据的图像?可以使用 32bpp 数据创建 DIB。正如您在文档中所读到的:

    CreateDIBSection 函数创建 应用程序可以写入的 DIB 直接地。该功能为您提供 指向位图位置的指针 位值。 如果 hSection 为 NULL,则系统 为 DIB 分配内存。如果 函数成功,返回值为 新创建的 DIB 的句柄,以及 *ppvBits 指向位图位值。

    试试这样的:

    VOID *ppvBits = NULL;
    BITMAPINFO BitmapInfo;
    memset(&BitmapInfo, 0, sizeof(BITMAPINFOHEADER));
    BitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    BitmapInfo.bmiHeader.biWidth = 1;
    BitmapInfo.bmiHeader.biHeight = 24;
    BitmapInfo.bmiHeader.biPlanes = 1;
    BitmapInfo.bmiHeader.biBitCount = 32;
    BitmapInfo.bmiHeader.biCompression = BI_RGB;
    HBITMAP hBitmap = CreateDIBSection(hDC, &BitmapInfo, DIB_RGB_COLORS, &ppvBits, NULL, 0);
    

    在我们的例子中 *ppvBits 指向 1 * 24 * (32 / 8) 个分配的字节。

    重要的是要知道,如果 biHeight 是正数,则位图是自下而上的 DIB,其原点是左下角。请参阅BITMAPINFOHEADER Structure 了解更多信息。

    【讨论】:

    • 谢谢你的回答,真的。在编写任何代码之前,我想了解一些事情:BITMAPINFO 是 BITMAPINFO 还是 BITMAPINFOHEADER?我很确定 BITMAPINFO 中的 bmiColors 是颜色表,我必须提供任何 bmiColors 还是什么? CreateDIBSection 的 iUsage 参数:“pbmi 指向的 BITMAPINFO 结构的 bmiColors 数组成员中包含的数据类型(逻辑调色板索引或文字 RGB 值)。” “DIB_RGB_COLORS:BITMAPINFO 结构包含一组文字 RGB 值。”什么是文字 RGB 值数组?
    • 我猜我应该忽略 bmiColors 的东西,只传递一个 BITMAPINFOHEADER 而不是 BITMAPINFO,因为这种情况是 32bpp 位图并且没有颜色表。但我还不知道我是愚蠢的还是 MSDN 非常混乱,或者两者兼而有之。你觉得你能启发我一点吗?
    • 在您的代码中,您忽略了 bmiColors,所以我认为我的推理是正确的。
    • 测试了你的代码,它可以工作。在我的特殊情况下,我坚持使用 CreateCompatibleBitmap 和 SetPixel,1.5 秒对 CreateDIBSection 3.6 秒,5000 次迭代。这些数字的原因是我在 Visual FoxPro 中执行此操作,与 24 SETPIXEL 相比,创建 BITMAPINFOHEADER 结构并将 RGB 整数数组转换为 rgbquads 的成本太高。在其他情况下,我认为您的答案更好。谢谢!
    • @Carlos 我认为您关于 bmiColors 和 iUsage 的问题非常有效。据我在 MSDN 上看到的文档还不清楚。几年前,我在新闻组中被教导以这种方式使用 CreateDIBSection()。 (顺便说一句,感谢您接受我的回答。)
    【解决方案2】:

    我通过使用 CreateCompatibleBitmap 和 SetPixel 解决了这个问题。我猜这不是最好的选择,但它确实有效。

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      • 2016-08-21
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      • 2013-01-06
      相关资源
      最近更新 更多