TransparentBitmap函数怎么把一张图片的背景色去掉 变成透明的

224 篇文章 3 订阅
//本函数把一种指定的颜色变成透明色,并可改变大小
//	hdc 显示句柄
//	hBitmap 要显示的位图
//	xStart,xStart 显示的位置
//	xadd,yadd 显示的位图的大小变化:放大缩小
//	如:xadd=3 表示位图宽度加 3
//	cTransparentColor 变成透明的那种颜色
void CMy1_6View ::TransparentBitmap(HDC hdc, HBITMAP hBitmap,short xStart,
short yStart, short xadd,short yadd, COLORREF cTransparentColor)
{	
BITMAP	m_bm;
COLORREF	cColor;

//  创建临时 DC
HDC	hMem, hBack, hObject, hTemp, hSave;
hBack	 = CreateCompatibleDC(hdc); hObject = CreateCompatibleDC(hdc); hMem		= CreateCompatibleDC(hdc); hSave	= CreateCompatibleDC(hdc); hTemp	  = CreateCompatibleDC(hdc);
//  选入位图
SelectObject(hTemp, hBitmap);
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&m_bm);
//显示位图宽高
POINT	ptSize;
//  取得位图的宽度
ptSize.x = m_bm.bmWidth;
//  取得位图的该度
ptSize.y = m_bm.bmHeight;
//  转换为逻辑点值
DPtoLP(hTemp, &ptSize, 1);

//  创建临时位图
HBITMAP	bmBack, bmObject, bmMem, bmSave;
//  单色位图
 
bmBack	= CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL);
bmObject = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL);
//  与设备兼容位图
bmMem	= CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);
bmSave	= CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);

//  将创建的临时位图选入临时 DC 中
HBITMAP		 OldbmBack, OldbmObject, OldbmMem, OldbmSave; OldbmBack		= (HBITMAP)SelectObject(hBack, bmBack); OldbmObject = (HBITMAP)SelectObject(hObject, bmObject); OldbmMem		  = (HBITMAP)SelectObject(hMem, bmMem); OldbmSave	= (HBITMAP)SelectObject(hSave, bmSave);

//  设置映射模式
SetMapMode(hTemp, GetMapMode(hdc));
//  先保留原始位图
BitBlt(hSave, 0, 0, ptSize.x, ptSize.y, hTemp, 0, 0, SRCCOPY);
//  将背景颜色设置为需透明的颜色
cColor = SetBkColor(hTemp, cTransparentColor);
//  创建目标屏蔽码
BitBlt(hObject, 0, 0, ptSize.x, ptSize.y, hTemp, 0, 0, SRCCOPY);
//  恢复源 DC 的原始背景色
SetBkColor(hTemp, cColor);

//  创建反转的目标屏蔽码
BitBlt(hBack, 0, 0, ptSize.x, ptSize.y, hObject, 0, 0, NOTSRCCOPY);
//  拷贝主 DC 的背景到目标 DC
BitBlt(hMem, 0, 0, ptSize.x, ptSize.y, hdc, xStart, yStart, SRCCOPY);
//  屏蔽位图的显示区
BitBlt(hMem, 0, 0, ptSize.x, ptSize.y, hObject, 0, 0, SRCAND);
//  屏蔽位图中的透明色
BitBlt(hTemp, 0, 0, ptSize.x, ptSize.y, hBack, 0, 0, SRCAND);
//  将位图与目标 DC 的背景左异或操作
BitBlt(hMem, 0, 0, ptSize.x, ptSize.y, hTemp, 0, 0, SRCPAINT);
//  拷贝目标到屏幕上
StretchBlt(hdc,  xStart,  yStart,  ptSize.x+xadd,  ptSize.y+yadd,  hMem,  0,  0,  ptSize.x, ptSize.y,SRCCOPY);
//  恢复原始位图
BitBlt(hTemp, 0, 0, ptSize.x, ptSize.y, hSave, 0, 0, SRCCOPY);

//  删除临时内存位图 DeleteObject(SelectObject(hBack, OldbmBack)); DeleteObject(SelectObject(hObject, OldbmObject)); DeleteObject(SelectObject(hMem, OldbmMem)); DeleteObject(SelectObject(hSave, OldbmSave));

//  删除临时内存 DC
DeleteDC(hMem); DeleteDC(hBack); DeleteDC(hObject); DeleteDC(hSave); DeleteDC(hTemp);
}  

代码转载自:http://bbs.csdn.net/topics/390581538

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值