CPaintDC dc(this);
CBitmap memBitmap;
CDC memDC;
//建立与屏幕显示兼容的内存显示设备
memDC.CreateCompatibleDC(NULL);
CBitmap *pOldBit=memDC.SelectObject(&memBitmap);
//memBitmap.CreateCompatibleBitmap(&dc,800,600);
memBitmap.LoadBitmap(IDB_START);
memDC.SelectObject(&memBitmap);
dc.BitBlt(0,0,800,600,&memDC,0,0,SRCCOPY);memBitmap.LoadBitmap(IDB_TEMP);
memDC.SelectObject(&memBitmap);
dc.BitBlt(100,100,487,368,&memDC,0,0,SRCAND);
memDC.SelectObject(pOldBit);
CDialog::OnPaint();问:我希望两层图像融合到一起,与白色部分融合等于原图象,与灰色融合原图象变暗,我的代码运行后为什么显示出来的图像那么难看啊,是不是因为调色板的原因,我该怎么做?谢谢。
CBitmap memBitmap;
CDC memDC;
//建立与屏幕显示兼容的内存显示设备
memDC.CreateCompatibleDC(NULL);
CBitmap *pOldBit=memDC.SelectObject(&memBitmap);
//memBitmap.CreateCompatibleBitmap(&dc,800,600);
memBitmap.LoadBitmap(IDB_START);
memDC.SelectObject(&memBitmap);
dc.BitBlt(0,0,800,600,&memDC,0,0,SRCCOPY);memBitmap.LoadBitmap(IDB_TEMP);
memDC.SelectObject(&memBitmap);
dc.BitBlt(100,100,487,368,&memDC,0,0,SRCAND);
memDC.SelectObject(pOldBit);
CDialog::OnPaint();问:我希望两层图像融合到一起,与白色部分融合等于原图象,与灰色融合原图象变暗,我的代码运行后为什么显示出来的图像那么难看啊,是不是因为调色板的原因,我该怎么做?谢谢。
解决方案 »
- 求教网络编程event模型问题
- 如果一个控件不是动态创建的,那么OnCreate不会被调用,就不会有WM_CREATE这个消息?
- 学习windows核心编程 该如何去实践理解
- IE中Activex控件闪烁的问题。(解决还有100分,up者有分)
- 再加100分,把问题重新详细描述一次,请大家帮忙,急
- 如何实现这样的窗体?
- VC7.0的一个特大bug!!!
- while(1) SOS++ ;
- 关于MS HTTP API的使用?
- VS2010 MFC生成了.exe文件却没有.dll文件
- ADO读取sql server 中text字段的问题
- 小妹初学编程,现在用递归的方法写了个迷宫程序,可总有问题?望大家多多指教 (100分)
CClientDC dc(this);
CDC *memdc;
CBitmap bitmap,pOldbmp;
HBITMAP hbitmap;
memdc=new CDC();
memdc->CreateCompatibleDC(&dc);
hbitmap=(HBITMAP)::LoadImage(NULL,"C:/aa.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
bitmap.Attach(hbitmap);
int bmWidth,bmHeight;
BITMAP bm;
::GetObject(hbitmap,sizeof(bm),&bm);
bmWidth=bm.bmWidth;
bmHeight=bm.bmHeight;
memdc->SelectObject(&bitmap);
BLENDFUNCTION ppfunction;
ppfunction.AlphaFormat=0;
ppfunction.BlendFlags=0;
ppfunction.BlendOp=AC_SRC_OVER;
ppfunction.SourceConstantAlpha=128;
if(::AlphaBlend(dc,100,100,bmWidth,bmHeight,*memdc,0,0,bmWidth,bmHeight,ppfunction)==FALSE)
AfxMessageBox("ERROR");通过修改ppfunction.SourceConstantAlpha=128;这个值在0-255之间
就可以在两幅图像间调整合成比例参数了
我想应该也是显示的那样,出现的问题是你对算法的估计错误!
何谓融合——就是你提出的And吗?
我指的好看就是能达到Photoshop中图层中混合模式设为正片叠底的效果!
[email protected]
[email protected]
你可以自己建一个工程,在两个内存dc上画两幅图像,然后就用这个api函数
不就行了。
参数dwRop为光栅操作码,决定位图的显示方式,这里介绍三个下面画透明位图需要用到的的光栅操作码:
光栅操作码:MERGEPAINT
效果:源的反向"或上"目标(即:dest=(NOT src) OR dest)
说明:白色或上任何颜色都等于白色;黑色或上任何颜色颜色都不变 光栅操作码:NOTSRCERASE
效果:源的反向"与上"目标的反向(即:dest=(NOT src) AND (NOT dest))
说明: 黑色与上任何颜色都等于黑色;白色与上任何颜色颜色都不变 光栅操作码:SRCINVERT
效果:源与目标"异或"起来(即:dest=src XOR dest)
说明:黑色与任何颜色异或都等于原来颜色;白色与任何颜色异或都等于原来颜色的反色例子:先准备一张精灵图片、一张精灵的掩膜图和一张背景图(见下图) 1.用精灵掩膜图处理精灵图片(BitBlt函数用MERGEPAINT光栅操作码): dcFairy.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&dcMask,0,0,);
处理过的精灵图片:
2.用精灵掩膜图处理背景(BitBlt函数用NOTSRCERASE光栅操作码) pDC->BitBlt(x,y,bm.bmWidth,bm.bmHeight,&dcMask,0,0,NOTSRCERASE);
处理过的背景图:
3.把处理过的精灵图片贴到背景上(BitBlt函数用SRCINVERT光栅操作码) pDC->BitBlt(x,y,bm.bmWidth,bm.bmHeight,&dcFairy,0,0,);
合成后的图形:完整代码如下:void DrawFairy(CDC *pDC, int x, int y) // pDC为窗口DC指针
{
CDC dcFairy;
CDC dcMask;
dcFairy.CreateCompatibleDC(pDC);
dcMask.CreateCompatibleDC(pDC); CBitmap *pMask=dcMask.SelectObject(&m_bmMask); // m_bmMask为精灵掩膜图
CBitmap *pFairy=dcFairy.SelectObject(&m_bmFairy); // m_bmFairy为精灵图片 // 得到精灵图片的大小
BITMAP bm;
m_bmFairy.GetObject(sizeof(bm),&bm); // 处理精灵图片
dcFairy.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&dcMask,0,0,MERGEPAINT); // 处理背景图片(用来贴精灵图片的那一部分)
pDC->BitBlt(x,y,bm.bmWidth,bm.bmHeight,&dcMask,0,0,NOTSRCERASE);
// 将处理过的精灵图片与背景经过处理的部分"异或"起来
pDC->BitBlt(x,y,bm.bmWidth,bm.bmHeight,&dcFairy,0,0,SRCINVERT); // Release
dcMask.SelectObject(pMask);
dcFairy.SelectObject(pFairy);
} 上面是用BitBlt函数的实现方法,我们也可以用直接操作位图数据缓冲区的方法:
testpicDlg.obj : error LNK2001: unresolved external symbol __imp__AlphaBlend@44
Release/testpic.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.MSDN中介绍的要求:
Header: Declared in Wingdi.h; include Windows.h.
Library: Included as a resource in Msimg32.dll.怎么做啊?!惭愧!
在你的程序
progect->setting->link->Object/library modules
中加入msimg32.lib
search GDIPlus and Alpha Blend in MSDN(2001 Oct+)