绘制透明背景位图

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
// when blitting from a monochrome DC to a color DC, 
// the color black in the source turns into the destination's text color, 
// and the color white in the source turns into the destination's background color. 
// If you blit from a color DC to a monochrome DC, 
// then all pixels in the source that are equal to the background color will turn white, and all other pixels will turn black. 
// In other words, GDI considers a monochrome bitmap to be black pixels on a white background. 
static void DrawTransBmp( HDC hDst, HBITMAP hImg, COLORREF clrTran )
{
    COLORREF colorOldFront;
    COLORREF colorOldBg;

    BITMAP bmp;
    GetObject( hImg, sizeof( bmp ), &bmp );

    HDC hForeDC = ::CreateCompatibleDC( hDst );
	::SelectObject ( hForeDC, hImg );

    //prepare mask dc
    HDC hDCMask = CreateCompatibleDC ( hDst );
    // MSDN:    When a memory device context is created, it initially has a 1-by-1 monochrome bitmap selected into it.
    //          If this memory device context is used in CreateCompatibleBitmap, the bitmap that is created is a monochrome bitmap. 
    HBITMAP hBmpMask = CreateCompatibleBitmap( hDCMask, bmp.bmWidth, bmp.bmHeight );
	::SelectObject ( hDCMask, hBmpMask );
    ::SetBkColor( hForeDC, clrTran );                                                //Set clrTran as blackground color
    ::BitBlt( hDCMask, 0, 0, bmp.bmWidth, bmp.bmHeight, hForeDC, 0, 0, SRCCOPY );    //monochrome, background color is white

    //mask the foreground 
    ::SetBkColor( hForeDC, RGB(0,0,0) );
    ::SetTextColor( hForeDC, RGB(255,255,255) );
	::BitBlt( hForeDC, 0, 0, bmp.bmWidth, bmp.bmHeight, hDCMask, 0, 0, SRCAND );

    //mask the background
    colorOldBg = ::SetBkColor( hDst, RGB(255,255,255) );
    colorOldFront = ::SetTextColor( hDst, RGB(0,0,0) );
	::BitBlt( hDst, 0, 0, bmp.bmWidth, bmp.bmHeight, hDCMask, 0, 0, SRCAND ); 

    //or foreground and background
	::BitBlt( hDst, 0, 0, bmp.bmWidth, bmp.bmHeight, hForeDC, 0, 0, SRCPAINT );

    //recover hDst color of background and foreground
    ::SetBkColor( hDst, colorOldBg );
    ::SetTextColor( hDst, colorOldFront );

    //release object
    ::DeleteDC( hDCMask );
    ::DeleteDC( hForeDC );
    ::DeleteObject( hBmpMask );
}

透明度的HBITMAP和Bitmap的转换 博客配套文件,解决常见的Bitmap转HBITMAP背景变浅,HBITMAP转Bitmap背景变黑的问题,并演示了如何输出HBITMAP和Bitmap的每行像素,所有代码封装成了类,可以直接在生产环境中使用。 立即下载

相关推荐

java下载google切片地图

java程序下载google影像图,代码下载粘贴就可以使用,下载格式为瓦片资源,可以用nginx代理为离线地图服务。

透明位图的三种做法(转)

http://www.handytech.cn/main/ArticleShow_38.htm 在编程中我们都希望程序的界面能够尽可能的美观,因此可以在程序中使用位图资源。但是位图是一个矩形阵列,在显示时总是以矩形形式显示,有什么方法能够让位图也显示成为不规则式样呢(即位图

风云爱飞 1325

关于位图背景透明化的实现

实现透明位图,有一个知识点必须要提前知道,那就是: 如果一个单色位图向彩色位图转换,那么单色位图为1的部分(也就是白色部分),会转换为彩色位图背景色,单色位图为0的部分(黑色部分),会转换为彩色位图的前景色。 如果一个彩色位图向单色位图转换,那么彩色位图背景色转换到单色位图中则为1(白色),其他的则转换为0(黑色)。 当然上面的1和0都是指bit位的值,还有这些转换是在设备上下文间的块

拿节 5299

使用BitBlt实现位图背景透明

mfc 绘制透明位图,BitBlt 函数SRCINVERT SRCAND模式详细说明

流年master的博客 1834

MFC 绘制透明背景位图

// 显示透明背景位图 // 显示透明背景位图 BOOL CSnowDlg::TransBit(CDC* dcSnow,CDC *dcDest,int pos_x,int pos_y) { // 创建空白DC CDC dcImg; CBitmap bmp; bmp.CreateCompatibleBitmap(dcSnow,32,32); dcImg.CreateCompatibl

fulianzhou的专栏 5449

关于BMP位图透明通道的详解制作教程, 教你输出透明的BMP位图

BMP支持透明比较常见的方法有两种:  一种是32位图,直接就可以是透明的,还可以是半透明效果,一般都是用PNG转成的,或者在保存图象时选择32位。  第二种就是把想透明的地方颜色设成255.255.0,但是有缺点就是不是所有软件都支持设透明色,而且软件透明部分的设定颜色也不一样,另外它不支持半透明。 32位的BMP,带一个ALPHA通道,在ALPHA通道里你要的地方是白色,不要的是黑色,就可以...

bruce135lee的专栏 2万+

VC++ 的 CImageList 绘制背景透明位图

程序效果图

maoyeahcom的博客 1076

android view为什么被绘制多次,Android SurfaceView多次绘制位图

我正在尝试将一个位图绘制到surfaceView中我可以成功绘制但是我需要根据其他一些用户移动在屏幕上移动该位图但是当我设置时canvas.drawColor(Color.TRANSPARENT);canvas.drawBitmap(bitmap, left, top, null);它在屏幕中多次绘制相同的位图 .但是当我这样做的时候canvas.drawColor(Color.GREEN);ca...

weixin_42122432的博客 278

MFC将bmp图像设为背景 接着是控件背景透明

1.在ResourseView里添加文件夹,命名为Bitmap 2.将要添加的bmp图像文件拷贝到工程文件res目录中 3.在Bitmap里插入Bitmap资源从res目录中选取刚加入的Bitmap,并命其ID为IDB_BITMAP1(随意) 4.修改CMYDlg::OnPaint()如下:   else  {   // 屏蔽 CDialog::OnPaint();

u014378023的专栏 1527

VC中的位图透明

1、VC6中,需要自己写函数代码 声明: void TransparentBlt( CDC* hdcDest,        // 目标DC                                  int nXOriginDest,   // 目标X偏移                                  int nYOriginDest,   // 目

Augusdi的专栏 1971

Edit控件中字体、颜色、的局部改变及背景的改变

<br />http://hi.baidu.com/%D0%A1%C2%DF%BC%AD/blog/item/0a988d3965f1112cb9998f38.html<br /> <br />=以下来自CSDN、vckbase、百度空间、百度知道=<br />利用CFontDialog和CColorDialog两个类创建两个对话框,使选择的字体大小、类型和字体的颜色应用到EDIT中<br />。<br /> CFontDialog fontDlg; <br /> if (fontDlg.DoModal

abin_gha的专栏 9270

C语言TransparentBlt函数,技术分享 - 使用TransparentBlt函数实现绘制透明位图

背景在自己本科的时候,喜欢用 VC6.0 写一些小游戏来锻炼自己的编程水平。那些小游戏的游戏画面绘制都是使用Windows提供的GDI(图形设备接口)函数实现的,并没有调用现成的游戏引擎。所以,使得自己对GDI函数比较熟悉,能用它开发各式各样的小游戏。其中,那些小游戏都会用到的一个关键技术,便是透明位图绘制。现在,我把之前自己开发小游戏时,绘制透明位图的方法总结一下,分别为大家介绍一下三种实现方...

weixin_30194213的博客 1100

VC 控件背景透明、文字背景透明

Visual C++  开发实战宝典   功能:位图上显示文字,背景透明。 void CP400Dlg::OnPaint()  { 。。。。 CBitmap bmp; bmp.LoadBitmap(IDB_YCH); BITMAP bmInfo; bmp.GetBitmap(&bmInfo); int nBmpWidth,nBmpHeight; nBmpWidth

lishoubox的专栏 1万+

c语言创建一个透明的窗口,二级C语言辅导:绘制透明位图

绘制透明位图是指绘制某一位图中除指定颜色外的其余部分,我们称这种颜色为“透明色”。通过将位图背景色指定为“透明色”,在绘制时,不绘制这部分背景,而仅绘制图像,这样就可以将位图中图像透明绘制到窗口上。绘制透明位图的关键是创建一个“掩码”位图(mask bitmap),“掩码”位图是一个单色位图,它是位图中图像的一个单色剪影。在Windows编程中,绘图都要用到设备描述表,我们需创建两个内...

weixin_35799294的博客 651

Delphi GDI对象之绘制位图

http://www.cnblogs.com/pchmonster/archive/2012/07/06/2579334.html 绘制位图(Drawing Bitmaps) 绘制位图听起来似乎很难,然而如几次所见到的那样,绘制位图非常容易。TCanvas类具有几种方法绘制位图,最常用的方法是Draw方法,这种方法只是在画布上指定位置绘制位图。用户已经见过几个这样的例子。下面是简短的例...

weixin_33835690的博客 155

6.VC(ui)-MFC下实现透明位图

我们在进行程序的界面设计时,常常希望将位图的前景显示在界面上,而将位图背景隐藏起来,将位图与界面很自然的融合在一起,本文介绍了透明位图的制作知识,并将透明位图在一个对话框中显示了出来。 直接上图:原图:Demo效果图: 步骤如下:   1、设置待显示位图背景颜色,也就是

hgy413的专栏 9068

透明显示位图

方法1:使用API TransparentBlt。 方法2:比API要快一点  void TransparentBltImage(HDC hdcDest,int nXOriginDest,int nYOriginDest,int nWidthDest,int nHeightDest,HDC hdcSrc,int nXOriginSrc,int nYOriginSrc,

飞翔的专栏 908
上一篇: Use kdiff3 in git
下一篇: MFC模态对话框的消息循环
键盘上的疯兔
博客等级 码龄18年 134粉丝 119原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值