最近开始学习dx,试着做一些小的程序来练习的时候发现一个问题,那就是如何把一个图片导入面后blt到其他面的时候只保留该图片中的单色相素,其他颜色的相素都以透明化处理;还忘这方面的前辈们指点一二,十分感谢!
解决方案 »
- 好不容易减肥好几斤,今天朋友说要给我再增回来,然后狂给我买好吃的。。。。。
- 200分 求助:关于SDK的TrayIcon类及处理Explorer外壳崩溃后任务栏重建消息
- 请问这个错误怎么解决?
- ODBC读ACCESS时出现的问题
- 电信行业 能解释一下吗? 是电子信息? 做什么? 有什么职位? 欢迎up
- 在视图/文档框架工程中,我在CMainFrame的OnCreate中这样加入浮动窗口,请问在浮动窗口中如何得到主框架文档指针?
- 怎么实现位图能够随着位图控件的大小而改变自己的显示大小
- 高分奉送;项目太急;领导崔的很紧
- 用VC写程序时,文件忽然消失,请问是怎么回事?
- INLINE
- 请问哪里可以下载到潘爱民的《COM原理与应用》
- 怎样用变量CString来给GUID变量
谢谢
http://www.ittide.com/document/article/graphic/
在丰富多彩的软件世界中,位图的处理技术尤为重要。透明位图的显示作为
一种常用的图像处理方法,被用在众多的软件中。其基本原理,也就是将一幅需
要透明显示的位图(其透明色为已知),制作出二幅需要的位图A与B,其中A为除
透明色外均填充为黑色,B为把透明色填充为黑色其余色不变,再用指定光栅操作
将两幅位图合并,可形成透明位图。
创建过程如下:
1、使用透明色背景,将位图拷贝到内存屏蔽位图中。
2、利用与白色相与不变色,与黑色相与成黑色的原理,将内存位图的的背景设置
成黑色、前景设置成白色,并将屏蔽位图用与操作拷贝到此内存位图中。形成位图B。
3、将显示设备背景设置为白色、前景设置成黑色,并将屏蔽位图用与操作拷贝到
显示设备中。形成位图A。
4、将内存位图用或操作拷贝到显示设备中。最终形成透明位图。
//参数说明:
//hDIB -位图句柄
//pPal -位图调色板
//xDest -显示位图的左上角x坐标
//yDest -显示位图的左上角y坐标
//colorTransparent -透明色
void DrawTransparentBitmap( CDC *pDC, int nXDest, int nYDest,HGLOBAL hDIB, COLORREF colorTransparent, CPalette *pPal)
BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;
int nColors = bmInfo.bmiHeader.biClrUsed ? bmInfo.bmiHeader.biClrUsed :
1 << bmInfo.bmiHeader.biBitCount;
int nWidth = bmInfo.bmiHeader.biWidth;
int nHeight = bmInfo.bmiHeader.biHeight;
LPVOID lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);
CDC memDC,maskDC;
memDC.CreateCompatibleDC( pDC );
CBitmap bmp;
bmp.CreateCompatibleBitmap( pDC, nWidth, nHeight );
CBitmap *pOldBitmap = memDC.SelectObject( &bmp );
if( pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE&&nColors<256)
CPalette *pOldMemPalette = memDC.SelectPalette(pPal, FALSE);
memDC.RealizePalette();
::SetDIBitsToDevice(memDC.m_hDC, 0, 0, nWidth, nHeight, 0, 0, 0,
nHeight, lpDIBBits, (LPBITMAPINFO)hDIB, DIB_RGB_COLORS);
maskDC.CreateCompatibleDC(pDC);
CBitmap maskBitmap;
maskBitmap.CreateBitmap( nWidth, nHeight, 1, 1, NULL );
maskDC.SelectObject( &maskBitmap );
memDC.SetBkColor( colorTransparent );
maskDC.BitBlt( 0, 0, nWidth, nHeight, &memDC, 0, 0, SRCCOPY );
memDC.SetBkColor(RGB(0,0,0));
memDC.SetTextColor(RGB(255,255,255));
memDC.BitBlt(0, 0, nWidth, nHeight, &maskDC, 0, 0, SRCAND);
pDC->SetBkColor(RGB(255,255,255));
pDC->SetTextColor(RGB(0,0,0));
pDC->BitBlt(nXDest, nYDest, nWidth, nHeight, &maskDC, 0, 0, SRCAND);
pDC->BitBlt(nXDest, nYDest, nWidth, nHeight, &memDC,
0, 0, SRCPAINT);
memDC.SelectObject( pOldBitmap );