VC++图片透明处理

原始图片:VC++图片透明处理 - lan_ne - 红烧绿豆沙
处理过程及结果
VC++图片透明处理 - lan_ne - 红烧绿豆沙>>(编个号)  VC++图片透明处理 - lan_ne - 红烧绿豆沙

假设希望把图片中绿色的部分透明掉
 1>原图(图1)保存至临时DC中(用hOrigin表示)
m_cbmp.LoadBitmap(IDB_BMP);//IDB_BMP是原图的资源标识符,m_cbmp为CBitmap对象
SelectObject(hOrigin,m_cbmp);
2>生成掩码图(图2)(用hMask表示)
bmpMask = CreateBitmap(ptSize.x, ptSize.y,1,1,NULL);//首先生成临时单色临时位图:
SelectObject(hMask,bmpMask);//将单色位图导入到hMask中
SetBkColor(hOrigin,RGB(0,255,0));//设置hOrigin的背景色
BitBlt(hMask, 0, 0, ptSize.x, ptSize.y, hOrigin, 0, 0, SRCCOPY);
//将彩图SRCCOPY进去,hMask中就是掩码图了,其中,hOrigin的背景色被设置为白色,其它都是黑色
3>生成黑背景图(图3)(hForeground表示)
BitBlt(hForeground, 0, 0, ptSize.x, ptSize.y, hOrigin, 0, 0, SRCCOPY);//原图复制到hForeground
SetBkColor(hForeground,RGB(0,0,0));
SetTextColor(hForeground,RGB(255,255,255));
BitBlt(hForeground, 0, 0, ptSize.x, ptSize.y, hMask, 0, 0, SRCAND);
图2中背景色区域(白)对应的图1区域中颜色与RGB(0,0,0)进行逻辑与运算
图2中前景色区域(黑)对应的图1区域中颜色与RGB(255,255,255)进行逻辑与运算
图3中,希望透明的区域是黑色,其它区域是正常图形色
4>生成透明图(图5)
SetBkColor(hBackground,RGB(255,255,255));
SetTextColor(hBackground,RGB(0,0,0));
BitBlt(hBackground, 0, 0, ptSize.x, ptSize.y, hMask, 0, 0, SRCAND);//hBackground就是图4
这种"打洞"图,希望透明的区域是透明的,其它区域是黑色
BitBlt(hBackground, 0, 0, ptSize.x, ptSize.y, hForeground, 0, 0, SRCPAINT);//
将黑背景图SRCPAINT上去,相当于每个点都执行逻辑或运算,可以得到图5,即透明图
注:图4,图5中透明区域背景色较深,是因为复制背景的时候,使用的是最左上角的背景图片,方便演示
4+>生成透明图(方法二,图7)
BitBlt(hdc, 150, 50, ptSize.x, ptSize.y, hMask, 0, 0, SRCAND);//将掩码图逻辑与到背景上得到图6
图6实际上与图4一样
BitBlt(hdc, 200, 50, ptSize.x, ptSize.y, hForeground, 0, 0, SRCPAINT);//将黑背景图逻辑或到图6上得图7
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值