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: 博客园 模板提供:沪江博客
|