【澳门新葡亰娱乐在线】画透明位图

2019-11-26 16:45 来源:未知

画透明位图

 

 

      大家在进展程序的分界面设计时,平日希望将位图的第生机勃勃部分,也既是图像的前程展现在分界面上,而将位图的背景隐蔽起来,将位图与分界面很自然的血脉相连在一块,本文介绍了晶莹剔透位图的炮制知识,并将透明位图在叁个会话框中体现了出去。 

包涵透明色的位图的绘图方法有多样,最简便易行的法门是调用现有的函数:TransparentBlt,也足以通过友好的代码实现相近TransparentBlt的功用,完毕进程也许有二种样式,生机勃勃种是优先做一张掩码位图,另生机勃勃种是动态变化掩码位图。本文将介绍动态变化掩码位图绘制具备透明区域位图的点子。

 

风度翩翩、TransparentBlt 函数的选取

 

TransparentBlt 函数在Windows98/Windows2003上述版本运维,系统中需求包含Msimg32.dll,使用时得以链接 Msimg32.lib。
Windows98下的TransparentBlt会爆发产资料源泄漏,所以不指出在WIN98下选用该函数。
TransparentBlt函数原型如下:

后生可畏、达成情势

  绘制"透明"位图是指绘制某壹人图中除内定颜色外的别的部分,我们称这种颜色为"透明色"。通过将位图的背景象钦点为"透明色",在绘制时,不绘制那部分背景,而仅绘制图像,那样就可以将位图中图像透明地绘制到窗口上。 

  绘制"透明"位图的严重性是创办叁个"掩码"位图(mask bitmap),"掩码"位图是二个单色位图,它是位图中图像的贰个单色剪影。在Windows编制程序中,绘图都要用到设备描述表,大家需创造八个内存设备描述表:位图设备描述表(image DC)和"掩码"位图设备描述表(mask DC)。位图设备描述表用来装入位图,而"掩码"位图设备描述表用来装入"掩码"位图。在"掩码"位图设备描述表中制作"掩码"位图的法子是:先创设叁个单色的Bitmap,装入mask DC,然后,以"SRCCOPY"的主意将富有位图的位图设备描述表绘制(BitBlt)到mask DC上。那样,mask DC的突显平面中的位图正是"掩码"位图。 

  平日情况下,绘制"透明"位图的实操步骤如下:

1、设置待显示位图的背景颜色,也正是安装大家希望透明显示的位图颜色;

2、位图设备描述表以"SRCINVERT"的格局绘制(BitBlt)到体现设备描述表上;

3、"掩码"位图设备描述表以"SRCAND"的章程绘制(BitBlt)到体现设备描述表上;

4、再将位图设备描述表以"SRCINVERT"的点子绘制(BitBlt)到浮现设备描述表上。那样除"透明色"外的其他位图部分(图像部分)就被绘制到窗口上了。

  上述操作中必要选取的位图显示函数BitBlt(卡塔尔国的原型和认证如下:

BOOL BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, 
int ySrc, DWORD dwRop );

  当中,参数int x表示贴到指标地的左上角X坐标;int y表示/贴到指标地的左上角Y坐标;int nWidth表示贴到目标地的区域上升的幅度;int nHeight表示贴到目的地的区域高度;CDC* pSrcDC代表存款和储蓄源位图的设备描述表;int xSrc表示源位图的左上角X坐标;int ySrc表示源位图的左上角Y坐标;DWO哈弗D dwRop为柵格运算标记(ROP卡塔尔国,它料定概念了何等将源文件、指标文件和情势(由现行选出的刷子画笔定义卡塔 尔(阿拉伯语:قطر‎的位结合去产生二个目的文件。对于拥有的道具项目,光栅操作(ROP卡塔 尔(阿拉伯语:قطر‎只简简单单地在代表位图颜色的每叁个bit位上进展有关操作而不思考他们的实际意义。微软为位图的光栅操作提供了三种方法,开拓人士能够动用分化的组合获得想要的特殊效果。由于篇幅的限量,本文只谈谈多种常用的光栅操作:

 

 

操作方式 

运算方式 

效果 

SRCCOPY  

src 

直接将源位图拷贝到目的设备上。 

SRCAND

src AND dest

将目标文件中对应于源文件黑色区域的部分变黑,将对应于白色区域的部分留着不动。

SRCINVERT

src XOR dest

将源插入到目标。二次使用时,将目标恢复到它原来的状态。在某种条件下可以代替SRCPAINT 操作。

SRCPAINT

src OR dest

将源文件中的白色区域刷到目标文件中。源中的黑色区域不转换到目标中。

 

  这里补充说明有些,展现位图的背景颜色能够通过PhotoShop等图像管理软件获取,当然,也得以经过读取位图上特别职位上的像素点的颜料来博取,前面二个达成起来比较便利,前者稍稍麻烦一些,那能够根据个人爱好自由选取。

 


BOOL TransparentBlt(

HDC hdcDest,      // 目标DC

int nXOriginDest,   // 目标X偏移

int nYOriginDest,   // 目标Y偏移

int nWidthDest,     // 目标宽度

int hHeightDest,    // 目标高度

HDC hdcSrc,         // 源DC

int nXOriginSrc,    // 源X起点

int nYOriginSrc,    // 源Y起点

int nWidthSrc,      // 源宽度

int nHeightSrc,     // 源高度

UINT crTransparent  // 透明色,COLORREF类型

);

二、Delphi下的兑现

procedure DrawTransBitmap(hdcDest: HDC;      // 目标DC
                    nXOriginDest,            // 目标X偏移
                    nYOriginDest,            // 目标Y偏移
                    nWidthDest,              // 目的宽度
                    nHeightDest: Integer;    // 目的中度
                    hdcSrc: HDC;             // 源DC
                    nXOriginSrc,             // 源X起点
                    nYOriginSrc: Integer;    // 源Y起点
                    crTransparent: TColor    // 透明色
                    );
var
  hOldImageBMP, hImageBMP, hOldMaskBMP, hMaskBMP: HBITMAP;
  hImageDC, hMaskDC: HDC;
begin
    hImageBMP := CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest);    // 创造包容位图
    hMaskBMP := CreateBitmap(nWidthDest, nHeightDest, 1, 1, NIL);            // 创立单色掩码位图
    hImageDC := CreateCompatibleDC(hdcDest);//临时DC
    hMaskDC := CreateCompatibleDC(hdcDest);//临时掩码DC
    hOldImageBMP := SelectObject(hImageDC, hImageBMP);
    hOldMaskBMP := SelectObject(hMaskDC, hMaskBMP);

    // 将源DC中的位图拷贝到一时DC中,源DC已经载入位图
    BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);

    // 设置一时DC的透明色
    SetBkColor(hImageDC, crTransparent);

    // 生成透亮区域为鲜青,其余区域为草绿的一时半刻掩码DC的掩码位图
    // 位图来自偶尔DC
    BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY);

    // 生成透亮区域为深绿,此外区域保持不改变的位图
    SetBkColor(hImageDC, RGB(0,0,0));
    SetTextColor(hImageDC, RGB(255,255,255));
    BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

    // 透明部分保障显示器不改变,此外一些改为浅湖蓝
    SetBkColor(hdcDest,RGB(255,255,255));
    SetTextColor(hdcDest,RGB(0,0,0));
    BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

    // "或"运算,生成最后效果
    BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);

    // 清理、恢复
    SelectObject(hImageDC, hOldImageBMP);
    DeleteDC(hImageDC);
    SelectObject(hMaskDC, hOldMaskBMP);
    DeleteDC(hMaskDC);
    DeleteObject(hImageBMP);
    DeleteObject(hMaskBMP);
end;


看一下Delphi自身的包裹

procedure TForm1.btn1Click(Sender: TObject);

var

  Bitmap : TBitMap;
begin
澳门新葡亰娱乐在线,  Bitmap := TBitmap.Create;
  Bitmap.Width := 200;
  Bitmap.Height := 180;
  try
    with Bitmap do begin
      Bitmap.Canvas.Rectangle(0, 0,   Bitmap.Width, Bitmap.Height);
      Transparent := True;
      TransParentColor := clwhite;
      Form1.Canvas.Draw(0,0,BitMap);
    end;
  finally
    Bitmap.Free;

  end;


运用示例:

三、VC下的达成

在开辟分界面及棋类游戏经过中,必要广大镂空的图片,况兼图片情势通常相比较固定.
据此封装了两种布满的镂空方法.

  1. 用以没有掩码图,独有钦定透明色,不开展伸缩
    void DrawTransBitmap( HDC hdcDest,             // 目标DC
                          int nXOriginDest,        // 目标X偏移
                          int nYOriginDest,        // 目标Y偏移
                          int nWidthDest,          // 指标宽度
                          int nHeightDest,         // 目的中度
                          HDC hdcSrc,              // 源DC
                          int nXOriginSrc,         // 源X起点
                          int nYOriginSrc,         // 源Y起点
                          COLORREF crTransparent   // 透明色,COLORREF类型
                        );
  1. 用于未有掩码图,唯有钦点透明色,能够开展伸缩
     void DrawTransBitmap( HDC hdcDest,       // 目标DC
                                                 int nXOriginDest,   // 目标X偏移
                                                 int nYOriginDest,   // 目标Y偏移
                                                 int nWidthDest,      // 目的宽度
                                                 int nHeightDest,    // 指标中度
                                                 HDC hdcSrc,          // 源DC
                                                 int nXOriginSrc,     // 源X起点
                                                 int nYOriginSrc,     // 源Y起点
                                                 int nWidthSrc,        // 源宽度
                                                 int nHeightSrc,      // 源高度
                                                 COLORREF crTransparent  // 透明色,COLORREF类型
          );

3.钦赐掩码图,和掩码图归于区别图片
 void DrawTransBitmap( HDC hdcDest,        // 目标DC
                                             int nXOriginDest,    // 目标X偏移
                                             int nYOriginDest,    // 目标Y偏移
                                             int nWidthDest,       // 指标宽度
                                             int nHeightDest,     // 目的中度
                                             HDC hdcSrc,          // 源DC
                                             HDC hdcMask,       //掩码DC
                                             int nXOriginSrc,     // 源X起点
                                             int nYOriginSrc,     // 源Y起点
                                            COLORREF crTransparent  // 透明色,COLORREF类型
                                          );

4.点名图片和掩码图同归属一张图片
void DrawTransBitmap(HDC hDC, 
                                           int nPosX, 
                                           int nPosY,
                                           int nCX, 
                                           int nCY, 
                                           HBITMAP hObj
                                           );

5.获得位图H奥迪Q7GN
   HRGN CreateBitmapRgn(int nWidth,int nHeight,HBITMAP hbmp,COLORREF cTrans);

以下是欧洲经济共同体代码
//用于未有掩码图,独有钦命透明色,不举办伸缩
//方法一:
void DrawTransBitmap( HDC hdcDest,      // 目标DC
                    int nXOriginDest,   // 目标X偏移
                    int nYOriginDest,   // 目标Y偏移
                    int nWidthDest,     // 指标宽度
                    int nHeightDest,    // 指标高度
                    HDC hdcSrc,         // 源DC
                    int nXOriginSrc,    // 源X起点
                    int nYOriginSrc,    // 源Y起点
                    COLORREF crTransparent  // 透明色,COLORREF类型
                    )
{
    HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest);    // 创制宽容位图
    HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL);            // 创设单色掩码位图
    HDC        hImageDC = CreateCompatibleDC(hdcDest);//临时DC 
    HDC        hMaskDC = CreateCompatibleDC(hdcDest);//有的时候掩码DC 
    hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP);
    hOldMaskBMP = (HBITMAP)SelectObject(hMaskDC, hMaskBMP);

    // 将源DC中的位图拷贝到不时DC中,源DC已经载入位图
     BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
 
    // 设置有的时候DC的透明色
    SetBkColor(hImageDC, crTransparent);

    // 生成透亮区域为中黄,别的区域为米红的不常掩码DC的掩码位图
    // 位图来自不经常DC
    BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY);

    // 生成透亮区域为玉米黄,此外区域保持不改变的位图
    SetBkColor(hImageDC, RGB(0,0,0));
    SetTextColor(hImageDC, RGB(255,255,255));
    BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

    // 透明部分保险显示器不变,其余一些改为青古铜色
    SetBkColor(hdcDest,RGB(255,255,255));
    SetTextColor(hdcDest,RGB(0,0,0));
     BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

    // "或"运算,生成最终效果
    BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);

    // 清理、恢复    
    SelectObject(hImageDC, hOldImageBMP);
    DeleteDC(hImageDC);
    SelectObject(hMaskDC, hOldMaskBMP);
    DeleteDC(hMaskDC);
    DeleteObject(hImageBMP);
    DeleteObject(hMaskBMP);
}

//用于未有掩码图,唯有钦命透明色,不进行伸缩
//方法二:
void DrawTransBitmap( HDC hdcDest,      // 目标DC
                    int nXOriginDest,   // 目标X偏移
                    int nYOriginDest,   // 目标Y偏移
                    int nWidthDest,     // 指标宽度
                    int nHeightDest,    // 目的高度
                    HDC hdcSrc,         // 源DC
                    int nXOriginSrc,    // 源X起点
                    int nYOriginSrc,    // 源Y起点
                    COLORREF crTransparent  // 透明色,COLORREF类型
                    )
{
    HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest);    // 创立包容位图
    HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL);            // 创立单色掩码位图
    HDC        hImageDC = CreateCompatibleDC(hdcDest);//临时DC 
    HDC        hMaskDC = CreateCompatibleDC(hdcDest);//有的时候掩码DC 
    hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP);
    hOldMaskBMP = (HBITMAP)SelectObject(hMaskDC, hMaskBMP);

    // 将源DC中的位图拷贝到有的时候DC中,源DC已经载入位图
     BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
 
    // 设置一时DC的透明色
    SetBkColor(hImageDC, crTransparent);

    // 生成透亮区域为藏蓝,别的区域为威尼斯红的一时半刻掩码DC的掩码位图
    // 位图来自有时DC
    BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY);

            
    BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCINVERT);
         
    BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

    BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCINVERT);
    // 清理、恢复    
    SelectObject(hImageDC, hOldImageBMP);
    DeleteDC(hImageDC);
    SelectObject(hMaskDC, hOldMaskBMP);
    DeleteDC(hMaskDC);
    DeleteObject(hImageBMP);
    DeleteObject(hMaskBMP);
}

//用于未有掩码图,只有钦定透明色,可以拓宽伸缩
//方法一:
void DrawTransBitmap( HDC hdcDest,      // 目标DC
                     int nXOriginDest,   // 目标X偏移
                     int nYOriginDest,   // 目标Y偏移
                     int nWidthDest,     // 目的宽度
                     int nHeightDest,    // 指标中度
                     HDC hdcSrc,         // 源DC
                     int nXOriginSrc,    // 源X起点
                     int nYOriginSrc,    // 源Y起点
                     int nWidthSrc,      // 源宽度
                     int nHeightSrc,     // 源高度
                     COLORREF crTransparent  // 透明色,COLORREF类型
                     )
{
    HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest);    // 创设宽容位图
    HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL);            // 创设单色掩码位图
    HDC        hImageDC = CreateCompatibleDC(hdcDest);
    HDC        hMaskDC = CreateCompatibleDC(hdcDest);
    hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP);
    hOldMaskBMP = (HBITMAP)SelectObject(hMaskDC, hMaskBMP);
    
    // 将源DC中的位图拷贝到不经常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);

    // 生成透亮区域为卡其灰,其余区域为葱青的掩码位图
    BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY);
    
    // 生成透亮区域为青黑,别的区域保持不改变的位图
    SetBkColor(hImageDC, RGB(0,0,0));
    SetTextColor(hImageDC, RGB(255,255,255));
    BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

    // 透明部分保证显示屏不改变,此外一些改为日光黄
    SetBkColor(hdcDest,RGB(0xff,0xff,0xff));
    SetTextColor(hdcDest,RGB(0,0,0));
    BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);
    
    // "或"运算,生成最后效果
    BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);
    
    SelectObject(hImageDC, hOldImageBMP);
    DeleteDC(hImageDC);
    SelectObject(hMaskDC, hOldMaskBMP);
    DeleteDC(hMaskDC);
    DeleteObject(hImageBMP);
    DeleteObject(hMaskBMP);
    
}

//用于未有掩码图,独有钦定透明色,能够开展伸缩
  //方法二:
void DrawTransBitmap( HDC hdcDest,      // 目标DC
                     int nXOriginDest,   // 目标X偏移
                     int nYOriginDest,   // 目标Y偏移
                     int nWidthDest,     // 指标宽度
                     int nHeightDest,    // 指标中度
                     HDC hdcSrc,         // 源DC
                     int nXOriginSrc,    // 源X起点
                     int nYOriginSrc,    // 源Y起点
                     int nWidthSrc,      // 源宽度
                     int nHeightSrc,     // 源高度
                     COLORREF crTransparent  // 透明色,COLORREF类型
                     )
{
  
      if (nWidthDest < 1) return false;
      if (nWidthSrc < 1) return false;
      if (nHeightDest < 1) return false;
      if (nHeightSrc < 1) return false;
      HDC dc = CreateCompatibleDC(NULL);
      HBITMAP bitmap = CreateBitmap(nWidthSrc, nHeightSrc, 1, GetDeviceCaps(dc,
      BITSPIXEL), NULL);
      if (bitmap == NULL)
       {
                DeleteDC(dc);    
                return false;
        }
     
    HBITMAP oldBitmap = (HBITMAP)SelectObject(dc, bitmap);
    if (!BitBlt(dc, 0, 0, nWidthSrc, nHeightSrc, dcSrc, nXOriginSrc,
                     nYOriginSrc, SRCCOPY))
    {
               SelectObject(dc, oldBitmap); 
               DeleteObject(bitmap);        
         DeleteDC(dc);                
         return false;
    }
       
    HDC maskDC = CreateCompatibleDC(NULL);
     HBITMAP maskBitmap = CreateBitmap(nWidthSrc, nHeightSrc, 1, 1, NULL);
 if (maskBitmap == NULL)
      {
          SelectObject(dc, oldBitmap); 
           DeleteObject(bitmap);        
           DeleteDC(dc);                
           DeleteDC(maskDC);            
           return false;
       }
       HBITMAP oldMask =  (HBITMAP)SelectObject(maskDC, maskBitmap);
       SetBkColor(maskDC, RGB(0,0,0));
       SetTextColor(maskDC, RGB(255,255,255));
  if (!BitBlt(maskDC, 0,0,nWidthSrc,nHeightSrc,NULL,0,0,BLACKNESS))
       {
              SelectObject(maskDC, oldMask); 
              DeleteObject(maskBitmap);      
              DeleteDC(maskDC);              
              SelectObject(dc, oldBitmap);   
              DeleteObject(bitmap);          
              DeleteDC(dc);                  
              return false;
       }
       SetBkColor(dc, crTransparent);
       BitBlt(maskDC, 0,0,nWidthSrc,nHeightSrc,dc,0,0,SRCINVERT);
      SetBkColor(dc, RGB(0,0,0));
       SetTextColor(dc, RGB(255,255,255));
       BitBlt(dc, 0,0,nWidthSrc,nHeightSrc,maskDC,0,0,SRCAND);
       HDC newMaskDC = CreateCompatibleDC(NULL);
       HBITMAP newMask;
       newMask = CreateBitmap(nWidthDest, nHeightDest, 1,
                                                  GetDeviceCaps(newMaskDC, BITSPIXEL), NULL);
  if (newMask == NULL)
       {
              SelectObject(dc, oldBitmap);
              DeleteDC(dc);
              SelectObject(maskDC, oldMask);
              DeleteDC(maskDC);
              DeleteDC(newMaskDC);
              DeleteObject(bitmap);     
              DeleteObject(maskBitmap); 
              return false;
       }
       SetStretchBltMode(newMaskDC, COLORONCOLOR);
       HBITMAP oldNewMask = (HBITMAP) SelectObject(newMaskDC, newMask);
       StretchBlt(newMaskDC, 0, 0, nWidthDest, nHeightDest, maskDC, 0, 0,
                    nWidthSrc, nHeightSrc, SRCCOPY);
       SelectObject(maskDC, oldMask);
       DeleteDC(maskDC);
       DeleteObject(maskBitmap); 
       HDC newImageDC = CreateCompatibleDC(NULL);
       HBITMAP newImage = CreateBitmap(nWidthDest, nHeightDest, 1,
        GetDeviceCaps(newMaskDC, BITSPIXEL), NULL);
  if (newImage == NULL)
       {
              SelectObject(dc, oldBitmap);
              DeleteDC(dc);
              DeleteDC(newMaskDC);
              DeleteObject(bitmap);     
              return false;
       }
       HBITMAP oldNewImage = (HBITMAP)SelectObject(newImageDC, newImage);
       StretchBlt(newImageDC, 0, 0, nWidthDest, nHeightDest, dc, 0, 0, nWidthSrc,
              nHeightSrc, SRCCOPY);
       SelectObject(dc, oldBitmap);
       DeleteDC(dc);
       DeleteObject(bitmap);     
       BitBlt( dcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest,
                          newMaskDC, 0, 0, SRCAND);
       BitBlt( dcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest,
                       newImageDC, 0, 0, SRCPAINT);
       SelectObject(newImageDC, oldNewImage);
       DeleteDC(newImageDC);
       SelectObject(newMaskDC, oldNewMask);
       DeleteDC(newMaskDC);
       DeleteObject(newImage);   
       DeleteObject(newMask);    
       return true;
}

钦点掩码图,和掩码图归属不一样图片
void DrawTransBitmap( HDC hdcDest,      // 目标DC
                    int nXOriginDest,   // 目标X偏移
                    int nYOriginDest,   // 目标Y偏移
                    int nWidthDest,     // 目的宽度
                    int nHeightDest,    // 目的高度
                    HDC hdcSrc,         // 源DC
                    HDC hdcMask,
                    int nXOriginSrc,    // 源X起点
                    int nYOriginSrc,    // 源Y起点
                    COLORREF crTransparent  // 透明色,COLORREF类型
                    )
{

    HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest);    // 创造宽容位图
     HDC        hImageDC = CreateCompatibleDC(hdcDest);//临时DC 
     hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP);
 
    // 将源DC中的位图拷贝到一时DC中,源DC已经载入位图
     BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
     // 设置一时DC的透明色
    SetBkColor(hImageDC, crTransparent);
    // 生成透亮区域为深绿,其它区域保持不改变的位图
    SetBkColor(hImageDC, RGB(0,0,0));
    SetTextColor(hImageDC, RGB(255,255,255));
    BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcMask, 0, 0, SRCAND);
    // 透明部分保证荧屏不改变,其余一些改为油红
    SetBkColor(hdcDest,RGB(255,255,255));
    SetTextColor(hdcDest,RGB(0,0,0));
     BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hdcMask, 0, 0, SRCAND);
     // "或"运算,生成最后效果
    BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);
    // 清理、恢复    
    SelectObject(hImageDC, hOldImageBMP);
    DeleteDC(hImageDC);
    DeleteObject(hImageBMP);
}

点名图片和掩码图同归属一张图纸
void DrawTransBitmap(HDC hDC, int nPosX, int nPosY, int nCX, int nCY, HBITMAP hObj)
{
    HDC hMemDC= CreateCompatibleDC(hDC);
    HBITMAP hOldBMP=(HBITMAP)::SelectObject(hMemDC,hObj);
      BitBlt(hDC,nPosX,nPosY,nCX,nCY,    hMemDC,nCX,0,SRCAND);
    BitBlt(hDC,nPosX,nPosY,nCX,nCY,    hMemDC,0,0,SRCPAINT);
    SelectObject(hMemDC,hOldBMP);
    DeleteDC(hMemDC);

HRGN CreateBitmapRgn(int nWidth,int nHeight,HBITMAP hbmp, COLORREF TransColor)
{
        HDC  hmemDC;
        //创设与传播DC包容的偶尔DC
        hmemDC = ::CreateCompatibleDC(NULL);        
        HBITMAP hOldBmp = (HBITMAP)::SelectObject(hmemDC,hbmp);
                
        //创制总的窗体区域,初步region为0
        HRGN hrgn;
        hrgn = ::CreateRectRgn(0,0,0,0);           
        
        int y;
        for(y=0;y<nHeight ;y++)
        {
            H大切诺基GN rgnTemp; //保存有时region
            
            int iX = 0;
            do
            {
                //跳过透明色找到下叁个非透明色的点.
                while (iX < nWidth  && ::GetPixel(hmemDC,iX, y) == TransColor)
                    iX++;
                
                //记住那一个开首点
                int iLeftX = iX;
                
                //寻觅下个透明色的点
                while (iX < nWidth  && ::GetPixel(hmemDC,iX, y) != TransColor)
                    ++iX;
                
                //创制二个分包源点与根本间高为1像素的有的时候“region”
                rgnTemp=::CreateRectRgn(iLeftX, y, iX, y+1);
                
                //合併到主"region".
                CombineRgn( hrgn,hrgn,rgnTemp, RGN_OR);
                
                //删除一时"region",不然下一次创办时和失误
                ::DeleteObject(rgnTemp);
            }while(iX <nWidth );
            iX = 0;
        }
        ::SelectObject(hmemDC,hOldBmp);

CBitmap FootballBMP;

FootballBMP.LoadBitmap(IDB_FOOTBALLBMP);

CDC ImageDC;

ImageDC.CreateCompatibleDC(pDC);

CBitmap *pOldImageBMP = ImageDC.SelectObject(&FootballBMP);

TransparentBlt(pDC->m_hDC, 0, 0, 218, 199, ImageDC.m_hDC, 0, 0, 218, 199, RGB(0,0,0xff));

ImageDC.SelectObject(pOldImageBMP);

二、实现TransparentBlt函数

为了驾驭有所透明色位图的绘图进程,我们来亲手组建多个有所同TransparentBlt功能相近的推行函数,称之为TransparentBlt2。

实验素材:有两张位图:bk.bmp是背景位图,football.bmp包括透明区域,透明色为深灰蓝奥迪Q3GB(0,0,0xff)
尝试目标:以bk.bmp为背景,将football.bmp绘制到背景中,产生如下的最终效果图。

2.1 透明位图绘制原理
假设football.bmp ->载入 HBITMAP hImageBMP -> 选入 HDC hImageDC

2.1.1 生成足球的单色掩码位图,透明区域为浅蓝(全1卡塔尔国,非透明区域为木色(全0)

HBITMAP hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); // 建立单色位图

SetBkColor(hImageDC, RGB(0,0,0xff)); // 设置背景色为蓝色

BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY); // 拷贝到hMaskDC

与上述同类足球位图伟铅色区域在掩码位图中成了白色,其余区域为红色,这个时候hMaskBMP 如下图:
(图一)

2.1.2 设置背景观为樱草黄,前程色为浅青,将掩码位图(图风流罗曼蒂克)与足球位图相"与"

SetBkColor(hImageDC, RGB(0,0,0));

SetTextColor(hImageDC, RGB(255,255,255));

BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);
http://www.bkjia.com/Cyy/493018.htmlwww.bkjia.comtruehttp://www.bkjia.com/Cyy/493018.htmlTechArticle包含透明色的位图的绘制方法有多种,最简单的方法是调用现成的函数: TransparentBlt,也可以通过自己的代码实现类似TransparentBlt的功能,实...

有关小说

相关寻找:

后天看甚

探索技术库

重回首页

  • Windows10-加快在店堂中的铺排
  • Windows10-AzureAD的支持,云的一败涂地
  • 解决Linux下Qt程序报『QString::arg: Argument missi
  • Android开采:getViewById重临null的来由定位,a
  • Qt一个破绽非常多的缓慢解决措施,Qt错误化解措施
  • 从日前两会看苹果和谷歌(Google卡塔 尔(阿拉伯语:قطر‎的最大梦魇,两会和

连锁频道: Java编程  C#教程  C语言  C++教程  VC教程  Delphi教程  VB教程  工具软件  

TAG标签:
版权声明:本文由澳门新葡亰娱乐在线发布于葡亰_棋牌,转载请注明出处:【澳门新葡亰娱乐在线】画透明位图