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;   
  }