原始图片:
处理过程及结果
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