分享
 
 
 

SRCINVERT

王朝百科·作者佚名  2012-04-30
窄屏简体版  字體: |||超大  

透明位图--SRCINVERT用法讲解

如果一个单色位图向彩色位图转换,那么单色位图为1的部分(也就是白色部分),会转换为彩色位图的背景色,单色位图为0的部分(黑色部分),会转换为彩色位图的背景色。如果一个彩色位图向单色位图转换,那么彩色位图的背景色转换到单色位图中则为1(白色),其他的则转换为0(黑色)。当然上面的1和0都是指bit位的值,还有这些转换是在设备上下文间的块数据操作前就进行的。由于windows上所有的位图操作都是基于内存设备上下文的,所以我们还需要创建两个设备上下文分别用于存放源位图和“掩码”位图。

位图在设备上下文之间块数据传递需要通过Biltblt实现,对于这个函数和关于bitblt的最后一个参数的光栅操作的具体含义的介绍,这里就不再赘述,具体可看MSDN上关于bilblt的描述。

接下去直接看代码,在代码中再通过注释对一些细节进行详细的描述。

CBitmap btfile;

btfile.LoadBitmap(IDB_BITMAP1);

BITMAP btinfo;

btfile.GetBitmap(&btinfo); //获取源位图的大小等信息

CClientDC dcClient(this);

CDC dcImage, dcMask; //分别创建对预显示位图的DC的兼容

DC dcImage.CreateCompatibleDC(&dcClient);

dcMask.CreateCompatibleDC(&dcClient);

CBitmap btSingleColor; //创建单色位图

btSingleColor.CreateBitmap(btinfo.bmWidth, btinfo.bmHeight, 1, 1, NULL); //载入源位图 dcImage.SelectObject(&btfile); //设置背景色,也就是源位图的透明色

dcImage.SetBkColor(RGB(255, 0, 0)); //载入单色位图

dcMask.SelectObject(&btSingleColor);//这里DC之间的块数据拷贝就用到了开头提到的知识点,从彩色位图向单色位图转换,//源位图的背景图拷到掩码DC中后变为白色,其他则为黑色

dcMask.BitBlt(0, 0, btinfo.bmWidth, btinfo.bmHeight, &dcImage, 0, 0, SRCCOPY); //设置显示DC的背景色和前景色

COLORREF color1 = dcClient.SetBkColor(RGB(255, 255, 255));

COLORREF color2 = dcClient.SetTextColor(RGB(0, 0, 0));// SRCINVERT:这个ROP代表异或位操作,SRCAND:代表与操作//如果对一数据做两次异或操作,那么数据将恢复到原数据,跟没操作一样//透明位图就是利用这个特性,将源位图异或的方式拷贝到显示DC两次//但是只拷贝两次的话,那么源位图将不显示,换种说法就是整张位图都被透明了//

这可不是我们想要的结果,我们的目的只是将背景色透明,所以我们还需要在这两次//异或操作中加入其他操作来实现我们想要的结果,这时候就需要上面准备的“掩码”//DC来帮忙了

dcClient.BitBlt(0, 0, btinfo.bmWidth, btinfo.bmHeight, &dcImage, 0, 0, SRCINVERT); //解决这个问题其实很简单,就是维持背景色不变,这样它在下次异或操作后会恢复源//数据,被透明了;然后将前景色变黑。 //掩码DC内的单色位图为1的部分,将会转换为显示DC的背景色,为0的部分转换//为显示DC的前景色,然后再与显示DC的块数据做与(SRCAND)操作,在位操作后,//背景色维持不变,前景色为0(黑色)

dcClient.BitBlt(0, 0, btinfo.bmWidth, btinfo.bmHeight, &dcMask, 0, 0, SRCAND); //然后源数据DC再与显示DC的数据块再做一次异或操作的,背景色恢复为显示DC//的图像数据,前景色则显示为源数据DC内的图像数据(0^1 = 1)

dcClient.BitBlt(0, 0, btinfo.bmWidth, btinfo.bmHeight, &dcImage, 0, 0, SRCINVERT);

//恢复显示DC的前景和背景色

dcClient.SetBkColor(color1); dcClient.SetTextColor(color2);

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有