位图的光栅操作及ROP码解析

本文详细介绍了Windows图形编程中位图的光栅操作,包括二元、三元和四元光栅操作码(ROP2、ROP3、ROP4)。通过解释光栅操作码的作用,如SRCPAINT、SRCAND等,并探讨了光栅操作的编码方式,以及在GDI函数中的应用,如BitBlt、StretchBlt和MaskBlt。此外,还讨论了三元光栅操作码在Windows 2000及以上版本中引入的新标志CAPTUREBLT和NOMIRRORBITMAP的用途。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

位图的光栅操作及ROP码解析

(SnowStart于2005年3月22日)

位图是windows图形编程中非常重要的一个方面。在进行普通的位图操作中,如GDI函数BitBltStretchBlt, StretchDIBits,都会用到一个光栅操作码,即ROP码,像SRCCOPYPATPAINTSRCAND等,由于最近在开发图形驱动,涉及了许多的ROP2ROP3ROP4的操作,对ROP码进行了深入的研究,以下详细介绍之以和大家分享。

二元光栅操作:我们在使用GDI画线和填充区域时,GDI使用二元光栅操作码ROP2组合画笔或画刷像素和目标像素以得到新的目标像素。如SetROP2函数和GetROP2函数支持16种二元光栅操作,如:(具体见wingdi.h)

#define R2_NOT              6   // Dn

#define R2_XORPEN           7   // DPx

三元光栅操作:对于图像有同样的光栅操作用于生成各种特殊效果,我们要处理的有三种像素,源图像像素、目标图像像素和画刷像素(模板图像像素),称之为三元光栅操作,使用的是ROP3,如:(更多的参见wingdi.h)

#define SRCPAINT (DWORD)0x00EE0086 // dest = source OR dest          

#define SRCAND   (DWORD)0x008800C6 // dest = source AND dest         

四元光栅操作:是混合了源图像像素,目标图像像素和模板画刷像素外,又增加了一个掩码位图,用到4个变量形成了四元光栅操作,相应的为ROP4,GDI函数中MaskBlt函数使用的是ROP4,也是唯一接受四元光栅操作的API函数

光栅操作的编码:

一个字节可以编码256种光栅操作,假定

### 三元光栅操作编程实现方法 #### 定义与背景 三元光栅操作(Ternary Raster Operations),简称ROP3,在图形处理中用于定义源像素(Src)、目标像素(Dest)以及图案(Pattern)之间的组合方式。这些操作广泛应用于Windows GDI函数,如BitBlt和PatBlt。 对于32位的光栅操作而言,实际上只有低24位被利用来表示不同的光栅操作模式[^2]。这意味着高位8位通常设置为零,尽管如此,在某些特定场景下仍需关注全部32位以确保兼容性和安全性[^1]。 #### 实现逻辑 具体来说,三元光栅操作遵循如下公式: \[ \text{Dest} = ((\text{Src} \oplus \text{Pattern}) \land (\text{Dest} \oplus \text{Src})) \oplus \text{Src} \] 其中`⊕`代表按位异或(XOR),`\land`则指代按位与(AND)[^4]。此表达式描述了如何通过给定的目标图像数据(`Dest`)、源图像数据(`Src`)及可能存在的填充样式(`Pattern`)计算最终显示效果。 #### 使用示例 下面给出一段C++代片段展示怎样应用三元光栅操作进行简单的矩形绘制: ```cpp #include <graphics.h> int main(){ initgraph(800,600); setbkcolor(WHITE);cleardevice(); RECT rect={200,0,600,300}; solidrectangle(rect.left,rect.top,rect.right,rect.bottom); const char* str="你好"; drawtext(str,&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE); // 应用三元光栅操作 SetTextColor(hdc,COLORREF(0xFF00FF)); BitBlt(hdc, 50, 50, 100, 100, hdc, 0, 0, DSTINVERT); getchar();closegraph(); return 0; } ``` 上述例子中的`DSTINVERT`即是一个典型的三元光栅操作常量,它会反转目的地颜色而不改变其他属性。注意这里假设存在有效的设备上下文句柄`hdc`供调用者传递给API函数。 #### 注意事项 由于现代操作系统版本已经引入了一些新特性(比如CAPTUREBLT和NOMIRRORBITMAP),所以在编写涉及屏幕捕捉或者窗口映射的应用程序时应当特别留意所选的操作是否支持此类扩展标志。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值