合成过程中你总需要选择一幅作为前景另一幅作为背景,因此可以把选作前景的位图先生成一个MASK,即只有黑白两色的位图,将背景与前景进行异或运算后与前景的MASK进行与运算,然后再与前景进行异或运算即可实现一种透明融合的效果。如果前景用F表示,背景用B表示,则背景与前景的异或可表示为F^B,因为MASK为像素值只有0和1的黑白图像,因此用异或后的结果与MASK进行与运算时,F^B与MASK中值为1的像素相与,结果不变,而与值为0的像素相与,则结果为0,之后再和前景进行异或运算,则F^B^F=B,0^F=F,因此实现了透明融合。
解决方案 »
- VS2005创建的带有Automation功能的对话框COM程序如何单例实例
- 本人想用c#实现自动填写并提交网页表单的功能
- 为什么可以hook到StartDoc但WritePrinter却不行?
- 请问谁帮我传一下《Visual C++技术内幕》?
- 如何从excel表中删除数据
- 一个关于在view上画图的问题请教高手(急,在线等)
- 请问如何让控件随对话框的大小改变而改变啊?在线~~~~~~~~~~~~~
- 如何改变Edit控件中文本的颜色?
- 老革命遇见新问题!
- 用Borland C++编的程序如何用VC的编译器来编译??(请高手指点)
- 请问如何防止一个应用程序被两次运行?
- 谁看谁头疼的问题!你除外!
{
// TODO: Add your control notification handler code here
CString szTempFileName;
LPBITMAPINFO lpBitmapInfoScr, lpBitmapInfoDst;
CDIB m_dibSource, m_dibDest;
int cx, cy, colorbits;
CString szEditBox;
m_ctlEditTarget.GetWindowText(szEditBox);
m_nTotalCount = m_lstCobCopy.GetItemCount();
if (m_nTotalCount < 2)
{
CString szTitle, szText;
szTitle.LoadString(IDS_WARNTITLE1);
szText.LoadString(IDS_WARNMSG1);
MessageBox(szText,szTitle,MB_OK|MB_ICONEXCLAMATION);
return;
}
else if (szEditBox == "")
{
CString szTitle, szText;
szTitle.LoadString(IDS_WARNTITLE1);
szText.LoadString(IDS_WARNMSG2);
MessageBox(szText,szTitle,MB_OK|MB_ICONEXCLAMATION);
return;
}
for(int iIndex=1; iIndex<=m_nTotalCount; iIndex++)
{
szTempFileName = m_lstCobCopy.GetItemText(iIndex-1,0);
m_dibSource.OpenDIB(szTempFileName);
lpBitmapInfoScr = m_dibSource.GetBitmapInfo();
cx = m_dibSource.Width();
cy = m_dibSource.Height();
colorbits = m_dibSource.GetBitCount();
if (iIndex == 1)
{
m_dibDest.Create(cx, cy, colorbits);
lpBitmapInfoDst = m_dibDest.GetBitmapInfo();
lpBitmapInfoDst->bmiHeader.biXPelsPerMeter
= lpBitmapInfoScr->bmiHeader.biXPelsPerMeter;
lpBitmapInfoDst->bmiHeader.biYPelsPerMeter
= lpBitmapInfoScr->bmiHeader.biYPelsPerMeter;
} for (int nScanLine = iIndex ; nScanLine < cy; nScanLine += m_nTotalCount)
{
CMemFile mem;
unsigned char *src,*dst;
ASSERT(nScanLine <= m_dibSource.Height() && nScanLine >= 0);
src = m_dibSource.GetLinePtr(nScanLine);
dst = m_dibDest.GetLinePtr(nScanLine);
UINT bt=m_dibDest.Bytes();
memcpy(src, dst, bt);
MEMORYSTATUS ms;
char szMsg[256];
ms.dwLength = sizeof(MEMORYSTATUS);
GlobalMemoryStatus( &ms );
wsprintf(szMsg, "Left: %ld", ms.dwAvailPhys);
m_szEditTarget = szMsg;
m_ctlEditTarget.SetWindowText(m_szEditTarget);
}
m_dibSource.DestroyDIB();
}
m_dibDest.SaveDIB(m_strSaveFileName, BMP);
m_dibDest.DestroyDIB();
CString szTitle, szText;
szTitle.LoadString(IDS_MSGTITLE1);
szText.LoadString(IDS_MSGTEXT1);
MessageBox(szText,szTitle,MB_OK|MB_ICONEXCLAMATION);
}以上是一种合成位图的方法,但内存处理需改进
easy?