bit blit如何在GDI中工作?

时间:2013-11-19 08:18:38

标签: c++ mfc gdi

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

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:4)

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

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

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

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

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

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

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