【问题标题】:How does bit blit work in GDI?位块在 GDI 中是如何工作的?
【发布时间】:2015-07-13 15:25:47
【问题描述】:

我对 bit blit 在 gdi 中的工作方式很感兴趣。我知道它会根据 dwROP 参数创建基于源位图和目标位图的结果位图,但我很感兴趣如何?我看到了一些示例,其中它用于使用单色蒙版和 SetBkColor() 函数完成的蒙版,我真的很困惑 BkColor 与这些位图有何关系......而在另一个例子中,使用了 SetTextColor(),用于去除背景...这些 DC 属性(bkColor 和 textColor)有什么关系?谢谢

【问题讨论】:

  • 好的,但是它是如何使用的呢?如果 dwROP 是 SRCAND、SRCCOPY 或 SRCPAINT?

标签: c++ mfc gdi


【解决方案1】:

你错了 BitBlt 从不使用文本作为背景颜色。 BitBlt 光栅操作使用模式(即当前选定的画笔)、源位图和目标位图。

dwRop 代码定义了这 3 个数据源之间的计算。

您可以在 Charles Petzold 的书中找到一个很好的解释这个 rop 代码是如何工作的。这是对应的chapter of the book。阅读“光栅操作”部分。

【讨论】:

【解决方案2】:

背景和文本颜色不起作用,只有在目标设备上下文中选择的当前画笔起作用。

BitBlt() 遍历源矩形中的像素,并在对像素数据应用数学运算后复制像素。 dwRop 值确定该操作。共有三个像素值通过运算组合来计算目标位图的像素值:

  • 源位图中的像素。 ROP 代码标识符包含“SRC”。
  • 画笔中的像素。如果使用,ROP 代码标识符包含“PAT”。
  • 写入前目标位图中的像素,如果使用,您将看到“DST”。

应用于像素值的数学运算非常简单。他们可以是

  • 无,dwROP = SRCCOPY 或 PATCOPY。
  • 始终设置为 0,dwROP = BLACKNESS
  • 始终设置为 1,dwROP = WHITENESS
  • NOT 运算符,与 C 程序中的 ~ 相同
  • AND 运算符,与 C 程序中的 & 相同
  • OR 运算符,与 | 相同在 C 程序中
  • XOR 运算符,与 C 程序中的 ^ 相同

这些操作非常简单,因为这是处理器可以轻松完成的事情。而且它们在硬件中加速非常简单。要记住的最重要的事情是它们是 bit 运算符,该运算应用于像素值中的每个单独的位。这使得 ROP 成为历史产物,它们仅对单色位图(1 像素 = 1 位)或索引位图格式(如 4bpp 或 8bpp)具有有用的结果,并带有精心挑选的调色板。这在 1980 年代的机器上很重要。

您今天使用的视频适配器类型以及位图格式至少为 16bpp,几乎总是 24bpp 或 32bpp。像 NOT 这样的位图像素的操作只会产生一种完全不同的颜色,人眼不会以任何方式识别出与原始颜色相关的颜色。今天你只使用 SRCCOPY。也许 PATCOPY 应用纹理画笔,你会使用 PatBlt() 代替。有多个 BitBlts 来创建透明效果的 hackorama,您可以使用 TransBlt() 或 GDI+。

【讨论】:

  • 感谢您的努力,先生,您的回答非常有用。我得出结论,从彩色 bmp 复制到单色时使用了 bkcolor 和 textcolor,对吗?
  • 这并非完全不可信。你问我一些我 25 年前尝试过的事情,当我看到结果时决心忘记。哪个有效。
  • 我完全明白你为什么决定这样做。我确信有更优雅的方式来实现这种事情。谢谢。
猜你喜欢
  • 2015-10-29
  • 2017-04-09
  • 2011-03-19
  • 2012-03-18
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 2014-10-29
相关资源
最近更新 更多