www.pudn.com > BMPChange.rar > BMPChangeView.cpp


// BMPChangeView.cpp : implementation of the CBMPChangeView class 
// 
 
#include "stdafx.h" 
#include "BMPChange.h" 
 
#include "BMPChangeDoc.h" 
#include "BMPChangeView.h" 
#include "math.h" 
#include "DSP.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CBMPChangeView 
 
IMPLEMENT_DYNCREATE(CBMPChangeView, CFormView) 
 
BEGIN_MESSAGE_MAP(CBMPChangeView, CFormView) 
	//{{AFX_MSG_MAP(CBMPChangeView) 
	ON_BN_CLICKED(IDC_OPENBMP, OnOpenBMP) 
	ON_BN_CLICKED(IDC_GRAY, OnGray) 
	ON_BN_CLICKED(IDC_CONTRARY, OnContrary) 
	ON_BN_CLICKED(IDC_CONTRAST, OnContrast) 
	ON_BN_CLICKED(IDC_DYNAMIC_COMPRESS, OnDynamicCompress) 
	ON_BN_CLICKED(IDC_GRAY_SPLIT, OnGraySplit) 
	ON_BN_CLICKED(IDC_GML, OnGml) 
	ON_BN_CLICKED(IDC_CDF, OnCdf) 
	ON_BN_CLICKED(IDC_SML, OnSml) 
	ON_BN_CLICKED(IDC_G1_FILTER, OnG1Filter) 
	ON_BN_CLICKED(IDC_G2_FILTER, OnG2Filter) 
	ON_BN_CLICKED(IDC_G3_FILTER, OnG3Filter) 
	ON_BN_CLICKED(IDC_BUTTERWORTH_L, OnButterworthL) 
	ON_BN_CLICKED(IDC_BUTTERWORTH_H, OnButterworthH) 
	ON_BN_CLICKED(IDC_RETRORSE_FILTER, OnRetrorseFilter) 
	ON_BN_CLICKED(IDC_WIENER_FILTER, OnWienerFilter) 
	ON_BN_CLICKED(IDC_SOBEL, OnSobel) 
	ON_BN_CLICKED(IDC_PREWITT, OnPrewitt) 
	ON_BN_CLICKED(IDC_ROBERTS, OnRoberts) 
	ON_BN_CLICKED(IDC_LAPLACIAN, OnLaplacian) 
	ON_BN_CLICKED(IDC_GUASS__LAPLACIAN, OnGuassLaplacian) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CBMPChangeView construction/destruction 
 
CBMPChangeView::CBMPChangeView() 
	: CFormView(CBMPChangeView::IDD) 
{ 
	//{{AFX_DATA_INIT(CBMPChangeView) 
		// NOTE: the ClassWizard will add member initialization here 
	//}}AFX_DATA_INIT 
	// TODO: add construction code here 
	m_dwFileLen=0; 
	m_bCanConv=false; 
} 
 
CBMPChangeView::~CBMPChangeView() 
{ 
} 
 
void CBMPChangeView::DoDataExchange(CDataExchange* pDX) 
{ 
	CFormView::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CBMPChangeView) 
		// NOTE: the ClassWizard will add DDX and DDV calls here 
	//}}AFX_DATA_MAP 
} 
 
BOOL CBMPChangeView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
 
	return CFormView::PreCreateWindow(cs); 
} 
 
void CBMPChangeView::OnInitialUpdate() 
{ 
	CFormView::OnInitialUpdate(); 
	GetParentFrame()->RecalcLayout(); 
	ResizeParentToFit(); 
 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CBMPChangeView diagnostics 
 
#ifdef _DEBUG 
void CBMPChangeView::AssertValid() const 
{ 
	CFormView::AssertValid(); 
} 
 
void CBMPChangeView::Dump(CDumpContext& dc) const 
{ 
	CFormView::Dump(dc); 
} 
 
CBMPChangeDoc* CBMPChangeView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CBMPChangeDoc))); 
	return (CBMPChangeDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CBMPChangeView message handlers 
 
void CBMPChangeView::OnOpenBMP()  
{ 
	CString FileName=""; 
	CFileDialog dlg(TRUE,"bmp","*.bmp",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"彩色位图文件(*.bmp)|*.bmp||",NULL); 
	if(dlg.DoModal()==IDOK) 
	{ 
		m_bCanConv=true; 
		FileName=dlg.GetPathName(); 
		m_fFile.Open(FileName,CFile::modeReadWrite); 
		m_dwFileLen=m_fFile.GetLength(); 
 
		unsigned char a[1],b[1]; 
		m_fFile.Seek(18,CFile::begin); 
		m_fFile.Read(b,1); 
		m_fFile.Read(a,1); 
		m_nWidth=a[0]*256+b[0]; 
		m_fFile.Seek(22,CFile::begin); 
		m_fFile.Read(b,1); 
		m_fFile.Read(a,1); 
		m_nHeight=a[0]*256+b[0]; 
		m_fFile.SeekToBegin(); 
	} 
	else 
		m_bCanConv=false; 
} 
 
void CBMPChangeView::OnGray()  
{ 
	if(m_bCanConv==true) 
	{ 
		m_bCanConv=false; 
		m_cpBuffer=new unsigned char [m_dwFileLen]; 
		m_fFile.Read(m_cpBuffer,m_dwFileLen); 
		int R=0,G=0,B=0,Y=0; 
		if(m_cpBuffer[28]==16) 
		{ 
			for(DWORD i=54;i>3; 
				G=(m_cpBuffer[i]&7)<<3; 
				i++; 
				G|=(m_cpBuffer[i]&224)>>5; 
				B=(m_cpBuffer[i]&31); 
				Y=(9798*R+19235*G+3735*B)/32768; 
				m_cpBuffer[i-1]=(Y<<3)|((Y&56)>>3); 
				m_cpBuffer[i]=((Y&7)<<5)|Y; 
			} 
		} 
		else if(m_cpBuffer[28]==24) 
		{ 
			for(DWORD i=54;i=S2) 
	{ 
		Y=(int)((Y-S1)*(255-T2)/(255-S2)+T2); 
	} 
	else 
	{ 
		Y=(int)((Y-S1)*(T2-T1)/(S2-S1)+T1); 
	} 
	if(Y>255) 
		Y=255; 
	if(Y<0) 
		Y=0; 
	return Y; 
} 
 
void CBMPChangeView::OnDynamicCompress()  
{ 
	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; 
		} 
		for(DWORD i=54;iS2) 
				m_cpBuffer[i]=255; 
			else 
				m_cpBuffer[i]=0; 
			i++; 
			if(m_cpBuffer[i]S2) 
				m_cpBuffer[i]=255; 
			else 
				m_cpBuffer[i]=0; 
			i++; 
			if(m_cpBuffer[i]S2) 
				m_cpBuffer[i]=255; 
			else 
				m_cpBuffer[i]=0; 
		}	 
		m_fFile.SeekToBegin(); 
		m_fFile.Write(m_cpBuffer,m_dwFileLen); 
		m_fFile.Close(); 
		if(m_cpBuffer!=NULL) 
			delete []m_cpBuffer; 
	} 
} 
 
void CBMPChangeView::OnCdf()  
{ 
	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)); 
 
		for(DWORD i=54;i=0.0f) 
					now_value=ps_r[i]-pu[j]; 
				else 
					now_value=pu[j]-ps_r[i]; 
				if(now_value=0.0f) 
					now_value=ps_g[i]-pu[j]; 
				else 
					now_value=pu[j]-ps_g[i]; 
				if(now_value=0.0f) 
					now_value=ps_b[i]-pu[j]; 
				else 
					now_value=pu[j]-ps_b[i]; 
				if(now_value=0.0f) 
					now_value=ps_r[j]-pu[i]; 
				else 
					now_value=pu[i]-ps_r[j]; 
				if(now_value=0.0f) 
					now_value=ps_g[j]-pu[i]; 
				else 
					now_value=pu[i]-ps_g[j]; 
				if(now_value=0.0f) 
					now_value=ps_b[j]-pu[i]; 
				else 
					now_value=pu[i]-ps_b[j]; 
				if(now_value0) 
							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;p0) 
							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]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;p0.45f) 
				{ 
					U[i*3*WN+j].Re/=H; 
					U[i*3*WN+j].Im/=H; 
				} 
				else 
				{ 
					U[i*3*WN+j].Re*=0.6f; 
					U[i*3*WN+j].Im*=0.6f; 
				} 
			} 
		} 
 
		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::OnWienerFilter()  
{ 
	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; 
		float K=0.05f; 
 
		for(int i=0;i0) 
						{ 
							v_r_v+=g_v*m_cpBuffer[55+l*m_nWidth*3+k*3]; 
							v_r_h+=g_h*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_v+=g_v*m_cpBuffer[55+l*m_nWidth*3+k*3+1]; 
							v_g_h+=g_h*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_v+=g_v*m_cpBuffer[55+l*m_nWidth*3+k*3+2]; 
							v_b_h+=g_h*m_cpBuffer[55+l*m_nWidth*3+k*3+2]; 
						} 
					} 
				} 
				m_temp[j*m_nWidth*3+i*3]=(int)(sqrt(v_r_v*v_r_v+v_r_h*v_r_h)/9); 
				m_temp[j*m_nWidth*3+i*3+1]=(int)(sqrt(v_g_v*v_g_v+v_g_h*v_g_h)/9); 
				m_temp[j*m_nWidth*3+i*3+2]=(int)(sqrt(v_b_v*v_b_v+v_b_h*v_b_h)/9); 
			} 
		} 
		for(p=55;p0) 
						{ 
							v_r_v+=g_v*m_cpBuffer[55+l*m_nWidth*3+k*3]; 
							v_r_h+=g_h*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_v+=g_v*m_cpBuffer[55+l*m_nWidth*3+k*3+1]; 
							v_g_h+=g_h*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_v+=g_v*m_cpBuffer[55+l*m_nWidth*3+k*3+2]; 
							v_b_h+=g_h*m_cpBuffer[55+l*m_nWidth*3+k*3+2]; 
						} 
					} 
				} 
				m_temp[j*m_nWidth*3+i*3]=(int)(sqrt(v_r_v*v_r_v+v_r_h*v_r_h)/9); 
				m_temp[j*m_nWidth*3+i*3+1]=(int)(sqrt(v_g_v*v_g_v+v_g_h*v_g_h)/9); 
				m_temp[j*m_nWidth*3+i*3+2]=(int)(sqrt(v_b_v*v_b_v+v_b_h*v_b_h)/9); 
			} 
		} 
		for(p=55;p0) 
						{ 
							v_r_v+=g_v*m_cpBuffer[55+l*m_nWidth*3+k*3]; 
							v_r_h+=g_h*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_v+=g_v*m_cpBuffer[55+l*m_nWidth*3+k*3+1]; 
							v_g_h+=g_h*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_v+=g_v*m_cpBuffer[55+l*m_nWidth*3+k*3+2]; 
							v_b_h+=g_h*m_cpBuffer[55+l*m_nWidth*3+k*3+2]; 
						} 
					} 
				} 
				m_temp[j*m_nWidth*3+i*3]=(int)(sqrt(v_r_v*v_r_v+v_r_h*v_r_h)/4); 
				m_temp[j*m_nWidth*3+i*3+1]=(int)(sqrt(v_g_v*v_g_v+v_g_h*v_g_h)/4); 
				m_temp[j*m_nWidth*3+i*3+2]=(int)(sqrt(v_b_v*v_b_v+v_b_h*v_b_h)/4); 
			} 
		} 
		for(p=55;p0) 
							v_r+=g[p_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[p_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[p_g]*m_cpBuffer[55+l*m_nWidth*3+k*3+2]; 
						p_g++; 
					} 
				} 
				v_r/=9; 
				v_g/=9; 
				v_b/=9; 
				if(v_r<0) 
					v_r=0; 
				if(v_g<0) 
					v_g=0; 
				if(v_b<0) 
					v_b=0; 
 
				m_temp[j*m_nWidth*3+i*3]=v_r; 
				m_temp[j*m_nWidth*3+i*3+1]=v_g; 
				m_temp[j*m_nWidth*3+i*3+2]=v_b; 
			} 
		} 
		for(int p=55;p0) 
							v_r+=g[p_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[p_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[p_g]*m_cpBuffer[55+l*m_nWidth*3+k*3+2]; 
						p_g++; 
					} 
				} 
				v_r/=25; 
				v_g/=25; 
				v_b/=25; 
				if(v_r<0) 
					v_r=0; 
				if(v_g<0) 
					v_g=0; 
				if(v_b<0) 
					v_b=0; 
 
				m_temp[j*m_nWidth*3+i*3]=v_r; 
				m_temp[j*m_nWidth*3+i*3+1]=v_g; 
				m_temp[j*m_nWidth*3+i*3+2]=v_b; 
			} 
		} 
		for(int p=55;p