⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bmpchangeview.cpp

📁 《Visual C/C++图形图像与游戏编程典型实例解析》所有源代码。特别适合初学者。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
				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 + -