首页 > 其他分享 >绘制透明背景位图

绘制透明背景位图

时间:2022-12-07 15:36:55浏览次数:71  
标签:透明 bmpMaskDC 背景 dc RGB bmpInfo 位图 绘制 bmpToShowDC


TransparentBlt

The TransparentBlt function performs a bit-block transfer of the color data corresponding to a rectangle of pixels from the specified source device context into a destination device context.


BOOL TransparentBlt( HDC hdcDest, // handle to destination DC int nXOriginDest, // x-coord of destination upper-left corner int nYOriginDest, // y-coord of destination upper-left corner int nWidthDest, // width of destination rectangle int hHeightDest, // height of destination rectangle HDC hdcSrc, // handle to source DC int nXOriginSrc, // x-coord of source upper-left corner int nYOriginSrc, // y-coord of source upper-left corner int nWidthSrc, // width of source rectangle int nHeightSrc, // height of source rectangle UINT crTransparent // color to make transparent );
使用起来也挺方便,如下


// 加载显示位图
CBitmap bmpTest;
if ( bmpTest.LoadBitmap( IDB_BITMAP1 ) )
{
BITMAP bmpInfo;
bmpTest.GetBitmap(&bmpInfo);

CDC mBufferDC;
mBufferDC.CreateCompatibleDC( &dc );
CBitmap* pOldBmp1 = mBufferDC.SelectObject( &bmpTest );

COLORREF bgColor = RGB( 27, 240, 67 ); // 位图背景颜色
::TransparentBlt( dc, 100, 100, bmpInfo.bmWidth, bmpInfo.bmHeight,
mBufferDC, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, bgColor );

mBufferDC.SelectObject( pOldBmp1 );
}


 

二、下面模拟TransparentBlt的实现过程,探究下底层实现, 整个实现过程的思想如下图所示,

绘制透明背景位图_位图

 

代码如下:


{
CPaintDC dc(this);

// 刷显示背景为绿色RGB( 125, 125, 200 )
CRect rect;
GetClientRect(&rect);
dc.FillSolidRect( rect.left, rect.top, rect.right, rect.bottom, RGB( 125, 125, 200 ) );


// 加载位图
CBitmap bmpToShow;
if ( !bmpToShow.LoadBitmap( IDB_BITMAP1 ) )
{
return;
}

// 获取位图宽、高
BITMAP bmpInfo;
bmpToShow.GetBitmap(&bmpInfo);
int nBmpWidth = bmpInfo.bmWidth;
int nBmpHeight = bmpInfo.bmHeight;

// 位图背景色
COLORREF bmpBkColor = RGB(27, 240, 67);

// 位图DC
CDC bmpToShowDC;
bmpToShowDC.CreateCompatibleDC( &dc );
CBitmap* pOldBmp1 = bmpToShowDC.SelectObject( &bmpToShow );

// 创建单色掩码位图
CBitmap maskBmp;
maskBmp.CreateBitmap( nBmpWidth, nBmpHeight, 1, 1, NULL );

// 掩码DC
CDC bmpMaskDC;
bmpMaskDC.CreateCompatibleDC( &dc );
CBitmap* pOldBmp2 = bmpMaskDC.SelectObject( &maskBmp );

// 【对应上图步骤1】生成位图的单色掩码图
// 原理:如果目标dc的位图是单色位图,源dc的位图是颜色位图,
// 则在实际光栅操作之前要把颜色位图转换成单色位图,转换规
// 则是,颜色位图中所有和背景色一致的象素都变成1,其他的象
// 素都被转换成0。
bmpToShowDC.SetBkColor( bmpBkColor );
bmpMaskDC.BitBlt( 0, 0, nBmpWidth, nBmpHeight,
&bmpToShowDC, 0, 0, SRCCOPY );

// 【对应上图步骤2】将显示区域与单色位图作AND操作
// 原理:当目标dc的位图是颜色位图,源dc的位图是单色的时候,
// 单色位图在实际的光栅操作(ROP)之前会被转换成颜色位图,
// 对应的位如果是0,则被转换目标dc的前景色,如果该位是1,
// 则被转换成目标dc的背景色。
dc.SetBkColor( RGB(255, 255, 255) );
dc.SetTextColor( RGB(0, 0, 0) );
dc.BitBlt( 100, 100, nBmpWidth, nBmpHeight,
&bmpMaskDC, 0, 0, SRCAND );

// // 【对应上图步骤3】对掩码进行取反操作
// bmpMaskDC.BitBlt( 0, 0, nBmpWidth, nBmpHeight,
// &bmpMaskDC, 0, 0, NOTSRCCOPY );
//
// // 【对应上图步骤4】原图与掩码进行AND操作
// // 原理:当目标dc的位图是颜色位图,源dc的位图是单色的时候,
// // 单色位图在实际的光栅操作(ROP)之前会被转换成颜色位图,
// // 对应的位如果是0,则被转换目标dc的前景色,如果该位是1,
// // 则被转换成目标dc的背景色。
// bmpToShowDC.SetBkColor( RGB( 255, 255, 255 ));
// bmpToShowDC.SetTextColor( RGB( 0, 0, 0) );
// bmpToShowDC.BitBlt( 0, 0, nBmpWidth, nBmpHeight,
// &bmpMaskDC, 0, 0, SRCAND );

// 步骤3和步骤4可以合并为一步
// 原理:当目标dc的位图是颜色位图,源dc的位图是单色的时候,
// 单色位图在实际的光栅操作(ROP)之前会被转换成颜色位图,
// 对应的位如果是0,则被转换目标dc的前景色,如果该位是1,
// 则被转换成目标dc的背景色。
bmpToShowDC.SetBkColor( RGB( 0, 0, 0 ) );
bmpToShowDC.SetTextColor( RGB( 255, 255, 255 ) );
bmpToShowDC.BitBlt( 0, 0, nBmpWidth, nBmpHeight,
&bmpMaskDC, 0, 0, SRCAND );


// 【对应上图步骤5】生成目标图片
dc.BitBlt( 100, 100, nBmpWidth, nBmpHeight,
&bmpToShowDC, 0, 0, SRCPAINT );


bmpMaskDC.SelectObject( pOldBmp2 );
bmpToShowDC.SelectObject( pOldBmp1 );
}


 

参考:

​http://www.programgo.com/article/20281711249/​

​https://wenku.baidu.com/view/bd80a841be1e650e52ea9981.html​

 

标签:透明,bmpMaskDC,背景,dc,RGB,bmpInfo,位图,绘制,bmpToShowDC
From: https://blog.51cto.com/u_15905375/5919599

相关文章

  • Python——问题解决:matplotlib.pyplot绘制函数中文乱码
    代码frompylabimportmpl#中文库mpl.rcParams['font.sans-serif']=['SimHei']mpl.rcParams['axes.unicode_minus']=False例子plt.title("三次样条插值11点")plt.pl......
  • uniapp使用canvas绘制两张图片合并为一张图并保存至手机(H5+小程序)
      需求:访客二维码图片,包含:1二维码  2访客信息1、二维码使用weapp-qrcode插件生成(canvas)2、访客信息绘制到背景canvas上3、最后,将二维码的canvas合并到背景can......
  • Sunxi平台上通过DirectFB绘制文本遇到的一个问题
    关于如何在Tina平台上使用DirectFB,请参考失之东榆,收之桑榆,东方不亮西方亮,活人不能让尿憋死,VIPP虽然不给力,但我们还有VPU(VE),VE支持支持画框和贴水印的操作,画框VIPP已经干......
  • CSS基础-选择器进阶,背景相关属性(颜色/图片)
    CSS基础-选择器进阶,背景相关属性(颜色/图片)目标:能够理解复合选择器的规则,并使用复合选择器在HTML中选择元素学习路径: 1.复合选择器 2.并集选择器 3.交......
  • 详解用BitBlt实现透明贴图
    效果:代码:structBitmapInDC{HDCm_hdc;HBITMAPm_hbmp;HGDIOBJm_hbmpOld;BitmapInDC(HDChdc,HBITMAPbmp){m_hdc=CreateCompatibleDC(hdc);......
  • HTML中背景图片自适应屏幕
    图片自适应屏幕大小 + 图片不变形<bodybackground="Images/BG1.jpg"属性background将URI所指向的图片作为背景    style="backgroun......
  • Matplotlib绘制透明背景的折线图
    Matplotlib是Python中最著名的绘图库,使用matplotlib.pyplot来绘制论文实验部分所需的折线图。基础知识所涉及到的要素有:一个figure包含两个子图,用subplot实现图片直......
  • 形状工具足球绘制
    第一步,点击形状工具,选择多边形,边数为6,填充无,描边为黑色,描边大小自己把控。绘制第一个然后按住alt进行复制,第二行后面改成黑色。绘制完给图层打组,并盖印图层使用椭......
  • OpenCV 绘制填充矩形
    OpenCV提供了填充多边形函数fillPoly,可以通过fillPoly绘制填充矩形:Matmat=Mat::zeros(1048,1048,CV_8UC3);//创建一个Matcv::PointrookPoints[1][4];......
  • 将pc网页设置为灰色背景
    在body增加filter样式:filter:grayscale(1);例子:调整效果:......