【问题标题】:How to create memory DC with 24 bits per pixel?如何创建每像素 24 位的内存 DC?
【发布时间】:2011-09-30 09:32:50
【问题描述】:

我需要它使用 GDI 函数处理 RGB24 数据(特别是 StretchBlt(),它非常快),我不能使用 CreateCompatibleDC(),因为它只能使用其他 DC 的颜色深度创建内存 DC。通常它与屏幕 DC 一起使用(通过将 NULL 指针传递给函数),通常屏幕的颜色深度值为 32。此外,我不能依赖它,因为如果屏幕设置发生更改,我的应用程序可能无法工作。

所以我需要一些方法来创建具有特定颜色深度的内存 DC。到目前为止,我只找到了一种使用 CreateDC() 函数的方法,但它需要许多特定于设备的参数,而且对我来说似乎有些不可靠。此外,有太多字段需要填充适当的值来调用 CreateDC()。

有没有更简单的方法来创建特定的内存 DC 而不是依赖某些设备?或者即使创建 24 bpp 的内存 DC?

附:我需要它来制作一些快速的图形。我已经尝试手动将 alpha 通道添加到位图,以便将其与兼容屏幕 32bpp 内存 DC 的情况下使用,它成功了,但速度太慢了。正如我上面所说,我不能依赖可以更改的屏幕设置。

【问题讨论】:

  • 需要专门使用gdi吗?如果没有,您是否调查过 Direct2D?我自己并没有真正对 D2D 做过任何事情,只是玩了一点矩形之类的东西,所以我不知道它是否适合您的问题。
  • @markh44 我没试过 Direct2D。我需要使用图形在 Win 组件和 DirectDraw 过滤器上绘图。 Direct2D 是否适合与 Windows 控件一起使用?
  • 我不知道 D2D 是否可以做到这一点。我猜是的,但看起来你已经找到了解决方案,所以你可能会想要坚持你所拥有的。

标签: c++ winapi gdi


【解决方案1】:

Bits-per-pixel 并不真正取决于 DC,而是取决于选择的位图。使用CreateDIBSection 创建一个 24bpp 位图,然后将其选入内存 DC。

【讨论】:

  • 我已经尝试过了。在这种情况下,SelectObject() 返回 NULL,这意味着发生了错误。我相信 DC 和位图的每像素位数必须相等,因为当我手动添加 Alpha 通道时,具有相同位图的相同事情会得到解决。也许这都是因为我使用 CreateBitmapIndirect() 创建位图?
  • 位图对象是否有效,而不是 NULL?
  • 是的,HBITMAP 是由 CreateBitmapIndirect() 从填充的 BITMAP 结构创建的,它不为空。如果我出于调试目的将其保存在文件中,则它是有效的 24bpp 位图。
  • 使用 CreateDIBSection,而不是 CreateBitmapIndirect。后者创建DDB(device-dependent bitmap),可能是它不能被选入屏幕兼容DC的原因。
  • 似乎它可以做我需要的事情。谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
  • 2022-01-02
  • 2012-11-03
  • 1970-01-01
  • 2015-07-12
  • 2015-01-14
  • 1970-01-01
相关资源
最近更新 更多