📄 filter.cpp
字号:
// Filter.cpp: implementation of the CFilter class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Log.h"
#include "Filter.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CFilter::CFilter()
{
m_pTemplate = NULL;
m_lCount=0;
}
CFilter::~CFilter()
{
if(m_pTemplate)
{
delete[] m_pTemplate;
}
}
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; //!!对于权相加非0的模板,比如高斯模板,此返回值易引入不同颜色
}
long CFilter::GetCount()
{
return m_lCount;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -