📄 bmpchangeview.cpp
字号:
float now_value=0.0f;
if(ps_r[i]-pu[j]>=0.0f)
now_value=ps_r[i]-pu[j];
else
now_value=pu[j]-ps_r[i];
if(now_value<min_value_r)
{
m_r=j;
min_value_r=now_value;
}
if(ps_g[i]-pu[j]>=0.0f)
now_value=ps_g[i]-pu[j];
else
now_value=pu[j]-ps_g[i];
if(now_value<min_value_g)
{
m_g=j;
min_value_g=now_value;
}
if(ps_b[i]-pu[j]>=0.0f)
now_value=ps_b[i]-pu[j];
else
now_value=pu[j]-ps_b[i];
if(now_value<min_value_b)
{
m_b=j;
min_value_b=now_value;
}
}
ns_r[i]=nu[m_r];
ns_g[i]=nu[m_g];
ns_b[i]=nu[m_b];
}
for(i=54;i<m_dwFileLen;i++)
{
m_cpBuffer[i]=ns_r[m_cpBuffer[i]];
i++;
m_cpBuffer[i]=ns_g[m_cpBuffer[i]];
i++;
m_cpBuffer[i]=ns_b[m_cpBuffer[i]];
}
m_fFile.SeekToBegin();
m_fFile.Write(m_cpBuffer,m_dwFileLen);
m_fFile.Close();
if(m_cpBuffer!=NULL)
delete []m_cpBuffer;
}
}
void CBMPChangeView::OnGml()
{
if(m_bCanConv==true)
{
m_bCanConv=false;
m_cpBuffer=new unsigned char [m_dwFileLen];
m_fFile.Read(m_cpBuffer,m_dwFileLen);
if(m_cpBuffer[28]!=24)
{
AfxMessageBox("请打开24位BMP位图!");
m_fFile.Close();
if(m_cpBuffer!=NULL)
delete []m_cpBuffer;
return;
}
int ns_r[256];
float ps_r[256];
int ns_g[256];
float ps_g[256];
int ns_b[256];
float ps_b[256];
memset(ns_r,0,sizeof(ns_r));
memset(ns_g,0,sizeof(ns_g));
memset(ns_b,0,sizeof(ns_b));
int nu[64];
float pu[64];
float temp_r[256];
float temp_g[256];
float temp_b[256];
float a=1.0f/(32.0f*63.0f);
for(int i=0;i<64;i++)
{
nu[i]=i*4;
pu[i]=a*i;
}
for(i=54;i<m_dwFileLen;i++)
{
ns_r[m_cpBuffer[i]]++;
i++;
ns_g[m_cpBuffer[i]]++;
i++;
ns_b[m_cpBuffer[i]]++;
}
for(i=0;i<256;i++)
{
ps_r[i]=ns_r[i]/((m_dwFileLen-54)/3.0f);
ps_g[i]=ns_g[i]/((m_dwFileLen-54)/3.0f);
ps_b[i]=ns_b[i]/((m_dwFileLen-54)/3.0f);
}
for(i=0;i<256;i++)
{
if(i==0)
{
temp_r[0]=ps_r[0];
temp_g[0]=ps_g[0];
temp_b[0]=ps_b[0];
}
else
{
temp_r[i]=temp_r[i-1]+ps_r[i];
temp_g[i]=temp_g[i-1]+ps_g[i];
temp_b[i]=temp_b[i-1]+ps_b[i];
}
ps_r[i]=temp_r[i];
ps_g[i]=temp_g[i];
ps_b[i]=temp_b[i];
}
for(i=0;i<64;i++)
{
if(i==0)
{
temp_r[0]=pu[0];
}
else
{
temp_r[i]=temp_r[i-1]+pu[i];
}
pu[i]=temp_r[i];
}
int A1_r=0;
int A2_r=0;
int A1_g=0;
int A2_g=0;
int A1_b=0;
int A2_b=0;
for(i=0;i<64;i++)
{
float min_value_r=1.0f;
float min_value_g=1.0f;
float min_value_b=1.0f;
for(int j=0;j<256;j++)
{
float now_value=0.0f;
if(ps_r[j]-pu[i]>=0.0f)
now_value=ps_r[j]-pu[i];
else
now_value=pu[i]-ps_r[j];
if(now_value<min_value_r)
{
A2_r=j;
min_value_r=now_value;
}
if(ps_g[j]-pu[i]>=0.0f)
now_value=ps_g[j]-pu[i];
else
now_value=pu[i]-ps_g[j];
if(now_value<min_value_g)
{
A2_g=j;
min_value_g=now_value;
}
if(ps_b[j]-pu[i]>=0.0f)
now_value=ps_b[j]-pu[i];
else
now_value=pu[i]-ps_b[j];
if(now_value<min_value_b)
{
A2_b=j;
min_value_b=now_value;
}
}
for(int k=A1_r;k<=A2_r;k++)
ns_r[k]=nu[i];
A1_r=A2_r+1;
for(k=A1_g;k<=A2_g;k++)
ns_g[k]=nu[i];
A1_g=A2_g+1;
for(k=A1_b;k<=A2_b;k++)
ns_b[k]=nu[i];
A1_b=A2_b+1;
}
for(i=54;i<m_dwFileLen;i++)
{
m_cpBuffer[i]=ns_r[m_cpBuffer[i]];
i++;
m_cpBuffer[i]=ns_g[m_cpBuffer[i]];
i++;
m_cpBuffer[i]=ns_b[m_cpBuffer[i]];
}
m_fFile.SeekToBegin();
m_fFile.Write(m_cpBuffer,m_dwFileLen);
m_fFile.Close();
if(m_cpBuffer!=NULL)
delete []m_cpBuffer;
}
}
void CBMPChangeView::OnG1Filter()
{
if(m_bCanConv==true)
{
m_bCanConv=false;
m_cpBuffer=new unsigned char [m_dwFileLen];
m_fFile.Read(m_cpBuffer,m_dwFileLen);
if(m_cpBuffer[28]!=24)
{
AfxMessageBox("请打开24位BMP位图!");
m_fFile.Close();
if(m_cpBuffer!=NULL)
delete []m_cpBuffer;
return;
}
//不能用char,也不能用::strcpy()
unsigned char* m_temp;
int v_r,v_g,v_b;
m_temp=new unsigned char [m_dwFileLen-55];
for(int p=55;p<m_dwFileLen;p++)
m_temp[p-55]=m_cpBuffer[p];
//5X5 模版
for(int i=0;i<m_nWidth;i++) //被处理像素在i列
{
for(int j=0;j<m_nHeight;j++) //被处理像素在j行
{
v_r=v_g=v_b=0;
for(int k=i-2;k<i+3;k++) //5*5模版
{
for(int l=j-2;l<j+3;l++)
{
if(m_cpBuffer[55+l*m_nWidth*3+k*3]<256 || m_cpBuffer[55+l*m_nWidth*3+k*3]>0)
v_r+=m_cpBuffer[55+l*m_nWidth*3+k*3];
if(m_cpBuffer[55+l*m_nWidth*3+k*3+1]<256 || m_cpBuffer[55+l*m_nWidth*3+k*3+1]>0)
v_g+=m_cpBuffer[55+l*m_nWidth*3+k*3+1];
if(m_cpBuffer[55+l*m_nWidth*3+k*3+2]<256 || m_cpBuffer[55+l*m_nWidth*3+k*3+2]>0)
v_b+=m_cpBuffer[55+l*m_nWidth*3+k*3+2];
}
}
m_temp[j*m_nWidth*3+i*3]=v_r/25;
m_temp[j*m_nWidth*3+i*3+1]=v_g/25;
m_temp[j*m_nWidth*3+i*3+2]=v_b/25;
}
}
for(p=55;p<m_dwFileLen;p++)
m_cpBuffer[p]=m_temp[p-55];
m_fFile.SeekToBegin();
m_fFile.Write(m_cpBuffer,m_dwFileLen);
m_fFile.Close();
if(m_cpBuffer!=NULL)
delete []m_cpBuffer;
if(m_temp!=NULL)
delete []m_temp;
}
}
void CBMPChangeView::OnG2Filter()
{
if(m_bCanConv==true)
{
m_bCanConv=false;
m_cpBuffer=new unsigned char [m_dwFileLen];
m_fFile.Read(m_cpBuffer,m_dwFileLen);
if(m_cpBuffer[28]!=24)
{
AfxMessageBox("请打开24位BMP位图!");
m_fFile.Close();
if(m_cpBuffer!=NULL)
delete []m_cpBuffer;
return;
}
unsigned char* m_temp;
m_temp=new unsigned char [m_dwFileLen-55];
for(int p=55;p<m_dwFileLen;p++)
m_temp[p-55]=m_cpBuffer[p];
unsigned char mask_r[9];
unsigned char mask_g[9];
unsigned char mask_b[9];
COLORREF mask[9];
//5X5 模版
for(int i=0;i<m_nWidth;i++) //被处理像素在i列
{
for(int j=0;j<m_nHeight;j++) //被处理像素在j行
{
int id=0;
for(int k=i-1;k<i+2;k++) //3*3模版
{
for(int l=j-1;l<j+2;l++)
{
if(m_cpBuffer[55+l*m_nWidth*3+k*3]<256 || m_cpBuffer[55+l*m_nWidth*3+k*3]>0)
mask_r[id]=m_cpBuffer[55+l*m_nWidth*3+k*3];
if(m_cpBuffer[55+l*m_nWidth*3+k*3+1]<256 || m_cpBuffer[55+l*m_nWidth*3+k*3+1]>0)
mask_g[id]=m_cpBuffer[55+l*m_nWidth*3+k*3+1];
if(m_cpBuffer[55+l*m_nWidth*3+k*3+2]<256 || m_cpBuffer[55+l*m_nWidth*3+k*3+2]>0)
mask_b[id]=m_cpBuffer[55+l*m_nWidth*3+k*3+2];
mask[id]=RGB(mask_r[id],mask_g[id],mask_b[id]);
id++;
}
}
unsigned char T;
for(k=0;k<8;k++) //冒泡排序法
{
for(int l=8;l>k;l--)
{
if(mask_r[l]<mask_r[l-1])
{
T=mask_r[l];
mask_r[l]=mask_r[l-1];
mask_r[l-1]=T;
}
if(mask_g[l]<mask_g[l-1])
{
T=mask_g[l];
mask_g[l]=mask_g[l-1];
mask_g[l-1]=T;
}
if(mask_b[l]<mask_b[l-1])
{
T=mask_b[l];
mask_b[l]=mask_b[l-1];
mask_b[l-1]=T;
}
}
}
m_temp[j*m_nWidth*3+i*3]=mask_r[4];//GetRValue(mask[4]);
m_temp[j*m_nWidth*3+i*3+1]=mask_r[4];//GetGValue(mask[4]);
m_temp[j*m_nWidth*3+i*3+2]=mask_r[4];//GetBValue(mask[4]);
}
}
for(p=55;p<m_dwFileLen;p++)
m_cpBuffer[p]=m_temp[p-55];
m_fFile.SeekToBegin();
m_fFile.Write(m_cpBuffer,m_dwFileLen);
m_fFile.Close();
if(m_cpBuffer!=NULL)
delete []m_cpBuffer;
if(m_temp!=NULL)
delete []m_temp;
}
}
void CBMPChangeView::OnG3Filter()
{
if(m_bCanConv==true)
{
m_bCanConv=false;
m_cpBuffer=new unsigned char [m_dwFileLen];
m_fFile.Read(m_cpBuffer,m_dwFileLen);
if(m_cpBuffer[28]!=24)
{
AfxMessageBox("请打开24位BMP位图!");
m_fFile.Close();
if(m_cpBuffer!=NULL)
delete []m_cpBuffer;
return;
}
//不能用char,也不能用::strcpy()
unsigned char* m_temp;
int v_r,v_g,v_b,g;
m_temp=new unsigned char [m_dwFileLen-55];
for(int p=55;p<m_dwFileLen;p++)
m_temp[p-55]=m_cpBuffer[p];
//3X3 模版
for(int i=0;i<m_nWidth;i++) //被处理像素在i列
{
for(int j=0;j<m_nHeight;j++) //被处理像素在j行
{
v_r=v_g=v_b=0;
for(int k=i-1;k<i+2;k++) //3*3模版
{
for(int l=j-1;l<j+2;l++)
{
if(k==i && l==j)
g=8;
else
g=-1;
if(m_cpBuffer[55+l*m_nWidth*3+k*3]<256 || m_cpBuffer[55+l*m_nWidth*3+k*3]>0)
v_r+=g*m_cpBuffer[55+l*m_nWidth*3+k*3];
if(m_cpBuffer[55+l*m_nWidth*3+k*3+1]<256 || m_cpBuffer[55+l*m_nWidth*3+k*3+1]>0)
v_g+=g*m_cpBuffer[55+l*m_nWidth*3+k*3+1];
if(m_cpBuffer[55+l*m_nWidth*3+k*3+2]<256 || m_cpBuffer[55+l*m_nWidth*3+k*3+2]>0)
v_b+=g*m_cpBuffer[55+l*m_nWidth*3+k*3+2];
}
}
m_temp[j*m_nWidth*3+i*3]=v_r/9;
m_temp[j*m_nWidth*3+i*3+1]=v_g/9;
m_temp[j*m_nWidth*3+i*3+2]=v_b/9;
}
}
for(p=55;p<m_dwFileLen;p++)
m_cpBuffer[p]=m_temp[p-55];
m_fFile.SeekToBegin();
m_fFile.Write(m_cpBuffer,m_dwFileLen);
m_fFile.Close();
if(m_cpBuffer!=NULL)
delete []m_cpBuffer;
if(m_temp!=NULL)
delete []m_temp;
}
}
void CBMPChangeView::OnButterworthL()
{
if(m_bCanConv==true)
{
m_bCanConv=false;
m_cpBuffer=new unsigned char [m_dwFileLen];
m_fFile.Read(m_cpBuffer,m_dwFileLen);
if(m_cpBuffer[28]!=24)
{
AfxMessageBox("请打开24位BMP位图!");
m_fFile.Close();
if(m_cpBuffer!=NULL)
delete []m_cpBuffer;
return;
}
CDSP dsp;
Complex* U;
int WM=(int)(log(m_nWidth)/log(2)+1.0f);
int HM=(int)(log(m_nHeight)/log(2)+1.0f);
WM=HM=max(WM,HM);
int WN=(int)pow(2,WM);
int HN=(int)pow(2,HM);
U=new Complex[WN*HN*3];
dsp.DFT_2D_FFT(m_cpBuffer+54,m_nWidth,m_nHeight,U);
float D0=250.0f;
float D1;
for(int i=0;i<HN;i++)
{
for(int j=0;j<WN*3;j++)
{
int k=(int)(j/3);
D1=(float)sqrt(i*i+k*k);
U[i*3*WN+j].Re*=1/(1+(D1/D0)*(D1/D0));
U[i*3*WN+j].Im*=1/(1+(D1/D0)*(D1/D0));
}
}
dsp.DFT_2D_IFFT(m_cpBuffer+54,m_nWidth,m_nHeight,U);
m_fFile.SeekToBegin();
m_fFile.Write(m_cpBuffer,m_dwFileLen);
m_fFile.Close();
if(m_cpBuffer!=NULL)
delete []m_cpBuffer;
if(U!=NULL)
delete []U;
}
}
void CBMPChangeView::OnButterworthH()
{
if(m_bCanConv==true)
{
m_bCanConv=false;
m_cpBuffer=new unsigned char [m_dwFileLen];
m_fFile.Read(m_cpBuffer,m_dwFileLen);
if(m_cpBuffer[28]!=24)
{
AfxMessageBox("请打开24位BMP位图!");
m_fFile.Close();
if(m_cpBuffer!=NULL)
delete []m_cpBuffer;
return;
}
CDSP dsp;
Complex* U;
int WM=(int)(log(m_nWidth)/log(2)+1.0f);
int HM=(int)(log(m_nHeight)/log(2)+1.0f);
WM=HM=max(WM,HM);
int WN=(int)pow(2,WM);
int HN=(int)pow(2,HM);
U=new Complex[WN*HN*3];
dsp.DFT_2D_FFT(m_cpBuffer+54,m_nWidth,m_nHeight,U);
float D0=5.0f,D1;
for(int i=0;i<HN;i++)
{
for(int j=0;j<WN*3;j++)
{
int k=(int)(j/3);
D1=(float)sqrt(i*i+k*k);
U[i*3*WN+j].Re*=1/(1+(D0/D1)*(D0/D1));
U[i*3*WN+j].Im*=1/(1+(D0/D1)*(D0/D1));
}
}
dsp.DFT_2D_IFFT(m_cpBuffer+54,m_nWidth,m_nHeight,U);
m_fFile.SeekToBegin();
m_fFile.Write(m_cpBuffer,m_dwFileLen);
m_fFile.Close();
if(m_cpBuffer!=NULL)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -