Chinaunix首页 | 论坛 | 博客
  • 博客访问: 34016
  • 博文数量: 14
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 142
  • 用 户 组: 普通用户
  • 注册时间: 2015-10-28 20:06
文章分类

全部博文(14)

文章存档

2016年(8)

2015年(7)

我的朋友

分类: C/C++

2016-04-13 19:58:31

  
    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).
    如果是单色的,那么对于目标设备环境而言,0表示前景颜色,而1表示背景颜色。

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

  1. void CTrp::Draw(CDC *pDC, CBitmap *pBmp, CRect rect)
  2. {
  3.     CDC MaskDC, MemBmpDC; //掩码位图DC和源位图DC

  4.     SetStretchBltMode(MaskDC.m_hDC,STRETCH_HALFTONE); //设置指定设备环境中的位图拉伸模式
  5.     SetStretchBltMode(pDC->m_hDC,STRETCH_HALFTONE); //将源矩形区中的像素映射到目标矩形区的像素块中,覆盖目标像素块的一般颜色与源像素的颜色接近

  6.     MaskDC.CreateCompatibleDC(pDC) ; //创建一个与指定设备兼容的内存设备上下文环境(DC)
  7.     CBitmap MaskBmp ;
  8.     MaskBmp.CreateBitmap(rect.Width(),rect.Height(),1,1,NULL) ; // 创建单色掩码位图
  9.     CBitmap *pOldMaskBmp = MaskDC.SelectObject(&MaskBmp) ;//使用SeletObject函数把它选入到内存设备环境中,只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上
  10.     
  11.     MemBmpDC.CreateCompatibleDC(pDC) ;
  12.     CBitmap *pOldMemBmpBmp = MemBmpDC.SelectObject(pBmp) ;
  13.     MemBmpDC.SetBkColor(MemBmpDC.GetPixel(1,1)) ;//检索指定坐标点的像素的RGB颜色值。
  14.     
  15.     BITMAP BT ;
  16.     pBmp->GetBitmap(&BT) ; //创建位图结构体,得到位图信息
  17.     
  18.     //透明
  19.     MaskDC.StretchBlt(0,0,rect.Width(),rect.Height(),&MemBmpDC,0,0,BT.bmWidth,BT.bmHeight,SRCCOPY) ;//直接复制,其中掩码位图对应原图背景色的为白色,值为1,其他都为黑色,值为0
  20.     pDC->StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),&MemBmpDC,0,0,BT.bmWidth,BT.bmHeight,SRCINVERT) ;//异或
  21.     pDC->StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),&MaskDC,0,0,rect.Width(),rect.Height(),SRCAND) ;//
  22.     pDC->StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),&MemBmpDC,0,0,BT.bmWidth,BT.bmHeight,SRCINVERT) ;//异或
  23.     
  24.     MaskDC.SelectObject(pOldMaskBmp) ; //把前面的pOld***选回来
  25.     MemBmpDC.SelectObject(pOldMemBmpBmp) ;
  26.     
  27.     MaskDC.DeleteDC() ; //当不再需要内存设备上下文环境时,可调用DeleteDc函数删除它
  28.     MemBmpDC.DeleteDC() ;
  29.     
  30.     MaskBmp.DeleteObject() ;
  31. }
    回头在整理。



 
阅读(1101) | 评论(0) | 转发(0) |
0

上一篇:vc树形控件整理

下一篇:关于afx_msg的理解

给主人留下些什么吧!~~