BOOL CFilter::Filter(const int nDefTemplate,BYTE *pBuffer,DWORD Size,DWORD Width, DWORD Height)
 {
SetTemplate(nDefTemplate);
if(!pBuffer)//Buf为空
 {
return false;
}
if((Width+16)*Height<Size||(Width-16)*Height>Size) //非8位色彩的位图
 {
//MYTODO:转化到8位
//应该在CBitmap类中RGB->YUV,只取亮度信息
AfxMessageBox("不支持非256色位图");
//return false;
}
Multiply(pBuffer,Size,Width,Height);
return true;
}
void CFilter::SetTemplate(const int nDefTemplate)
 {
if(m_pTemplate)
 {
delete[] m_pTemplate;
}
switch(nDefTemplate)
 {
case TEMPLATE_LOG:
 {
m_TemplateWidth=5;
m_fCoef=1;
BYTE btTemplateSize=m_TemplateWidth*m_TemplateWidth;
m_pTemplate=new char[btTemplateSize];
 char btTemp[25]= {
-2,-4,-4,-4,-2,
-4, 0, 8, 0,-4,
-4, 8,24, 8,-4,
-4, 0, 8, 0,-4,
-2,-4,-4,-4,-2};
::memcpy(m_pTemplate,&btTemp,btTemplateSize);
}
break;
case TEMPLATE_LAPLACIAN:
 {
m_TemplateWidth=3;
m_fCoef=1;
BYTE btTemplateSize=m_TemplateWidth*m_TemplateWidth;
m_pTemplate=new char[btTemplateSize];
 char btTemp[9]= {-1,-1,-1,-1,9,-1,-1,-1,-1};
::memcpy(m_pTemplate,&btTemp,btTemplateSize);
}
break;
case TEMPLATE_GAUSS:
 {
m_TemplateWidth=3;
m_fCoef=1/16.0; //不能1/16,否则会变成0
BYTE btTemplateSize=m_TemplateWidth*m_TemplateWidth;
m_pTemplate=new char[btTemplateSize];
 char btTemp[9]= {1,2,1,2,4,2,1,2,1};
::memcpy(m_pTemplate,&btTemp,btTemplateSize);
}
break;
default:
TRACE("没有该默认的模板");
}
}
void CFilter::Multiply(BYTE *pBuffer, DWORD Size, DWORD Width, DWORD Height)
 {
int nBorder=m_TemplateWidth/2; //需要空开的大小
DWORD dwOffset=0;
float fResult=0;
int nTempNum=0;
BYTE* pTempBuffer=new BYTE[Size];
for(DWORD y=0+nBorder;y<Height-nBorder;y++) //因为窗口中心点要受模板大小影响
for(DWORD x=0+nBorder;x<Width-nBorder;x++)
 {
dwOffset=Size-Width-y*Width+x;
for(int i=-nBorder;i<=nBorder;i++)
for(int j=-nBorder;j<=nBorder;j++)
 {
nTempNum=m_pTemplate[i*m_TemplateWidth+j+nBorder*m_TemplateWidth+nBorder];
fResult+=pBuffer[dwOffset+(-i)*Width+j]*nTempNum;
m_lCount++;
}
fResult*=m_fCoef;
pTempBuffer[dwOffset]=CutOverflow(fResult);
fResult=0;
}
::memcpy(pBuffer,pTempBuffer,Size);
delete[] pTempBuffer;
}

BYTE CFilter::CutOverflow(float fNum)
 {
if(fNum>255.0)
return (BYTE)255;
else if(fNum<0.0)
return (BYTE)0;
else
return (BYTE)fNum;
}
|
|
常用链接
留言簿
文章分类(12)
文章档案(14)
搜索
最新评论

Powered By: 博客园 模板提供:沪江博客
|