我对gdi中的bit blit是如何工作感兴趣的。我知道它基于dwROP参数创建了基于源和目标位图的结果位图,但我感兴趣的是怎么样?我看到了一些用于屏蔽的例子,用单色蒙版和SetBkColor()函数完成,我真的很困惑BkColor如何与这些位图相关...而在另一个例子中,使用了SetTextColor(),删除背景......这些DC属性(bkColor和textColor)如何相关?感谢
答案 0 :(得分:4)
你错了BitBlt从不使用文本作为背景颜色。 BitBlt栅格操作使用模式(即当前选定的画笔),源和目标位图。
dwRop代码定义了这3个数据源之间的计算。
你可以在Charles Petzold的书中找到一个很好的解释这个rop代码是如何工作的。这是相应的chapter of the book。阅读“光栅操作”部分。
答案 1 :(得分:4)
背景和文字颜色不起作用,只是在目标设备上下文中选择的当前画笔。
BitBlt()遍历源矩形中的像素,并在对像素数据应用数学运算后复制像素。 dwRop值确定该操作。有三个像素值由操作组合以计算目标位图的像素值:
应用于像素值的数学运算非常简单。他们可以
这些操作非常简单,因为这是处理器可以轻松完成的任务。它们在硬件加速方面非常简单。要记住的最重要的事情是它们是位运算符,该操作应用于像素值中的每个单独位。这使得ROP成为历史神器,它们仅在单色位图(1像素= 1位)或索引位图格式(如4bpp或8bpp)上具有有用的结果,并具有精心选择的调色板。这在20世纪80年代的机器上很重要。
您今天使用的视频适配器类型以及位图格式至少为16bpp,几乎总是24bpp或32bpp。像这样位图的像素上的NOT操作仅产生一种完全不同的颜色,人眼不会以与原始颜色相关的任何方式识别该颜色。今天你只使用SRCCOPY。也许PATCOPY应用纹理画笔,你可以使用PatBlt()代替。有多个BitBlts的hackorama可以创建透明效果,你可以使用TransBlt()或GDI +。