VC编程之VC透明位图的实现原理
小标 2019-04-26 来源 : 阅读 768 评论 0

摘要:本文主要向大家介绍了VC编程之VC透明位图的实现原理,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

本文主要向大家介绍了VC编程之VC透明位图的实现原理,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

VC编程之VC透明位图的实现原理

透明和不透明:


        透明象素是那些不会影响目标文件的象素,看不见的象素;不透明象素就是将会出现在目标文件上覆盖原来位置的点的象素。




白色和黑色:分别被假定为全1和全0的值




基本的操作:BitBlt涉及到从源文件到目标文件的块传递,另外也有单色和彩色位图之间的转换。


单色和彩色位图之间的转换:从单色位图到彩色位图,单色位图中是1的地方需要先转换为彩色位图的背景色,全0的地方需要转换为前景色,然后在进行块间操作;从彩色位图到单色位图,彩色位图中所有和背景色一致的地方设置为全1,即白色,其余部分为0,黑色,然后操作。




(原文:When using BitBlt() to convert a monochrome bitmap to a color bitmap, GDI transforms all white bits (1) to the background color of the destination device context (DC). GDI transforms all black bits (0) to the text (or foreground) color of the destination DC. When using BitBlt() to convert a color bitmap to a monochrome bitmap, GDI sets to white (1) all pixels that match the background color of the source DC. All other bits are set to black (0).)




光栅操作:


        BitBlt函数的最后一个参数指定了一个光栅操作(ROP),它明确定义了如何将源文件、目标文件和模式(由现在选出的刷子画笔定义)的位组合去形成一个目标文件。因为一个位图只是一个位值的集合,光栅操作(ROP)只是一个在位上操作的布尔等式。相应使用的设备,位图中的代表不同的事物。


        在多色设备上,每个象素由一个位集合代表,他们要么形成一个指向颜色的索引,要么直接代表一种颜色。

        在单色设备上,每个象素由一个位来代表,0表示黑色并且1代表白色。

对于所有的设备类型,光栅操作(ROP)只简单地在位展示上进行而不考虑他们的实际意义。



           

SRCCOPY


           

           

src


           
直接将源拷到目的地
SRCANDsrc and dest将目标文件中对应于源文件黑色区域的部分变黑,将对应于白色区域的部分留着不动
SRCINVERTsrc XOR dest将源插入到目标。二次使用时,将目标恢复到它原来的状态。在某种条件下可以代替SRCPAINT 操作
SRCPAINTsrc OR dest将源文件中的非白色区域刷到目标文件中。源中的黑色区域不转换到目标中。


主要介绍的光栅操作:  SRCINVERT实现异或操作,两次异或操作相同于还原,例如1与1异或为0,0再与1异或结果还为1,回到之前的值。


使用举例: 


/* 自绘制透明位图的函数                                                 */  BOOL DrawTransparentBmp(HDC hdcDest,                          int nXOriginDest,                          int nYOriginDest,                          int nWidthDest,                          int nHeightDest,                          HDC hdcSrc,                          int nXOriginSrc,                          int nYOriginSrc,                          int nWidthSrc,                          int nHeightSrc,                          UINT crTransparent)  {      if (nWidthDest < 1)      {          return false;      }       if (nWidthSrc < 1)      {          return false;      }       if (nHeightDest < 1)      {          return false;      }       if (nHeightSrc < 1)      {          return false;      }       HDC hMaskDC,hImageDC;      HBITMAP hMaskBitmap,hOldMaskBitmap;      HBITMAP hImageBitmap,hOldImageBitmap;       //创建mask DC 和临时存源文件的 DC      hMaskDC = CreateCompatibleDC(hdcDest);      hImageDC = CreateCompatibleDC(hdcDest);       //创建mask 位图和p_w_picpath 兼容位图      hMaskBitmap = CreateBitmap(nWidthSrc,nHeightSrc,1,1,NULL);   //单色位图      hImageBitmap = CreateCompatibleBitmap(hdcDest,nWidthSrc,nHeightSrc);  //彩色位图       //将位图选进DC中      hOldImageBitmap = (HBITMAP)SelectObject(hImageDC,hImageBitmap);      hOldMaskBitmap = (HBITMAP)SelectObject(hMaskDC,hMaskBitmap);       //将src位图拷入临时的p_w_picpath DC中      if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc)      {          BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest,               hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);      }      else     {          StretchBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc,                    nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY);      }       //设置整个需要透明的颜色      SetBkColor(hImageDC,crTransparent);      //此步生成掩码位图(mask bitmap),注意整个位图中白为1,黑为0      //整个mask 位图中透明色的地方是白色,其他为黑色      BitBlt(hMaskDC, 0, 0, nWidthSrc, nHeightSrc,            hImageDC, nXOriginSrc, nYOriginSrc, SRCCOPY);      SetBkColor(hdcDest, RGB(255, 255, 255));      SetTextColor(hdcDest, RGB(0, 0, 0));       BitBlt(hdcDest, nXOriginDest, nYOriginDest,            nWidthSrc, nHeightDest, hImageDC, nXOriginSrc, nYOriginSrc, SRCINVERT);      BitBlt(hdcDest, nXOriginDest, nYOriginDest,            nWidthSrc, nHeightDest, hMaskDC, 0, 0, SRCAND);      BitBlt(hdcDest, nXOriginDest, nYOriginDest,            nWidthSrc, nHeightDest, hImageDC, nXOriginSrc, nYOriginSrc, SRCINVERT);      return true;  }


解说:


// Set up destination for monochrome blt (only needed for monochrome

// mask). These are the default values and may not need to be

// changed. They should also be restored.

SetBkColor(hdcDest, RGB(255, 255, 255)); // 1s --> 0xFFFFFF

SetTextColor(hdcDest, RGB(0, 0, 0)); // 0s --> 0x000000


// Do the real work.

BitBlt(hdcDest, x, y, dx, dy, hdcSrc, x0, y0, SRCINVERT);

BitBlt(hdcDest, x, y, dx, dy, hdcMask, 0, 0, SRCAND);

BitBlt(hdcDest, x, y, dx, dy, hdcSrc, x0, y0, SRCINVERT);

被屏蔽的块传递处理中的三步操作如下:

第一步(带SRCINVERT的位块传递)将源位图异或到目标文件。这看起来有点意思,但第二步异或有把目标文件恢复成原始状态的效果。

第二步(带SRCAND的位块传递)是一个屏蔽操作。当屏蔽与目标文件相与,所有的透明象素都不会改变目标文件的象素,而不透明象素则直接把目标文件变为黑。现在目标文件中有了一个源文件的不透明部分给勾勒出来的图象,而它自身在透明部分中的异或图象。

第三步(带SRCINVERT的位块传递)与源文件异或送到目标文件。透明象素被恢复成源状态(两步异或就能做到),不透明象素则季节从源文件上复制。

   

以上就介绍了VC/MFC的学习,希望对VC/MFC有兴趣的朋友有所帮助。了解更多内容,请关注职坐标编程语言VC/MFC频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程