尊天命,尽人事
分类: Android平台
2013-01-29 23:28:52
实现代码(VC)
画透明位图通常的方法是使用遮罩。所谓遮罩就是一张黑白双色的位图,他和要透明的位图是对应的,遮罩描述了位图中需要透明的部分,透明的部分是黑色的,而不透明的是白色的,白色的部分就是透明的部分。
假设图A是要画的透明位图,图B是遮罩,图A上是一个大写字母A,字母是红色的,背景是黑色的,图B背景是白色的,上面有一个黑色的字母A和图A的形状是一样的。
比如我们要在一张蓝天白云的背景上透明地画图A,就是只把红色的字母A画上去。我们可以先将图B和背景进行与操作,再把图B和背景进行或操作就可以了。
BOOL DrawTransparentBmp(HDC hdc, HBITMAP hbmp, RECT &rect, COLORREF colorTrans) { HDC dcImage, dcTrans, dcImage24; HBITMAP holdbmp24, hbmp24; HBITMAP holdbmp; HBITMAP hbmpTrans, holdbmpTrans; // 创建内存DC dcImage = CreateCompatibleDC(hdc); dcTrans = CreateCompatibleDC(hdc); dcImage24 = CreateCompatibleDC(hdc); if (dcImage == NULL || dcTrans == NULL || dcImage24 == NULL) // Error: can't create compatible dc return FALSE; // 获取图像属性 BITMAP bmp; GetObject(hbmp, sizeof(bmp), &bmp); // 选择图片到目标DC中 holdbmp = (HBITMAP)SelectObject(dcImage, hbmp); // 创建24位图 PBITMAPINFO lpBmpInfo; lpBmpInfo = (BITMAPINFO*) new BYTE[sizeof(BITMAPINFOHEADER)]; lpBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); lpBmpInfo->bmiHeader.biPlanes = 1; lpBmpInfo->bmiHeader.biBitCount = 24;//nBitCount; lpBmpInfo->bmiHeader.biCompression = BI_RGB; lpBmpInfo->bmiHeader.biSizeImage = 0; lpBmpInfo->bmiHeader.biClrUsed = 0; lpBmpInfo->bmiHeader.biWidth = bmp.bmWidth; lpBmpInfo->bmiHeader.biHeight = bmp.bmHeight; HDC dc = CreateCompatibleDC(NULL); // 生成新图片 LPVOID lpBits; hbmp24 =::CreateDIBSection(dc,lpBmpInfo,DIB_RGB_COLORS, &lpBits,NULL,0); DeleteDC(dc); delete lpBmpInfo; if (hbmp24 == NULL) // Error return FALSE; //将24位图片选择到位图DC ldbmp24 = (HBITMAP)SelectObject(dcImage24, hbmp24); // 将原图绘制到24位图中 itBlt(dcImage24, 0, 0, bmp.bmWidth, bmp.bmHeight, dcImage, 0, 0, SRCCOPY); // 创建Mask图 hbmpTrans = CreateBitmap(bmp.bmWidth, bmp.bmHeight, 1, 1, NULL); if (hbmpTrans == NULL) // Error return FALSE; // 选择Mask图到dcTrans中 holdbmpTrans = (HBITMAP)SelectObject(dcTrans, hbmpTrans); // 创建掩码图像(基于指定的颜色),即AND Mask图 ORREF oldbkcolor = SetBkColor(dcImage24, colorTrans); BitBlt(dcTrans, 0, 0, bmp.bmWidth, bmp.bmHeight, dcImage24, 0, 0, SRCCOPY); SetBkColor(dcImage24, RGB(0,0,0)); COLORREF oldtextcolor = SetTextColor(dcImage24, RGB(255,255,255)); BitBlt(dcImage24, 0, 0, bmp.bmWidth, bmp.bmHeight, dcTrans, 0, 0, SRCAND); // 去除指定颜色 COLORREF crOldBack, crOldText; crOldBack = SetBkColor(hdc, RGB(255,255,255)); crOldText = SetTextColor(hdc, RGB(0,0,0)); // 显示透明图 StretchBlt(hdc, rect.left, rect.top, rect.right - rect.left,rect.bottom - rect.top, dcTrans, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCAND); StretchBlt(hdc, rect.left, rect.top, rect.right - rect.left,rect.bottom - rect.top, dcImage24, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCPAINT); // 恢复设置及其释放资源 SelectObject(dcImage, holdbmp); SelectObject(dcImage24, holdbmp24); SelectObject(dcTrans, holdbmpTrans); DeleteObject(hbmp24); DeleteObject(hbmpTrans); SetBkColor(hdc, crOldBack); SetTextColor(hdc, crOldText); SetBkColor(dcImage24, oldbkcolor); SetTextColor(dcImage24, oldtextcolor); DeleteDC(dcImage); DeleteDC(dcImage24); DeleteDC(dcTrans); return TRUE; }