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

📄 bmpchangeview.cpp

📁 《Visual C/C++图形图像与游戏编程典型实例解析》所有源代码。特别适合初学者。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// 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<m_dwFileLen;i++)
			{
				R=(m_cpBuffer[i]&248)>>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<m_dwFileLen;i++)
			{
				R=m_cpBuffer[i];
				i++;
				G=m_cpBuffer[i];
				i++;
				B=m_cpBuffer[i];
				Y=(9798*R+19235*G+3735*B)/32768;
				m_cpBuffer[i-2]=Y;
				m_cpBuffer[i-1]=Y;
				m_cpBuffer[i]=Y;
			}
		}
		else
		{
			AfxMessageBox("请打开16位或24位BMP位图!");
			m_fFile.Close();
			if(m_cpBuffer!=NULL)
				delete []m_cpBuffer;
			return;
		}
		m_fFile.SeekToBegin();
		m_fFile.Write(m_cpBuffer,m_dwFileLen);
		m_fFile.Close();
		if(m_cpBuffer!=NULL)
			delete []m_cpBuffer;
	}
}

void CBMPChangeView::OnContrary() 
{
	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;i<m_dwFileLen;i++)
		{
			m_cpBuffer[i]=255-m_cpBuffer[i];
			i++;
			m_cpBuffer[i]=255-m_cpBuffer[i];
			i++;
			m_cpBuffer[i]=255-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::OnContrast() 
{
	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;i<m_dwFileLen;i++)
		{
			m_cpBuffer[i]=Contrast(m_cpBuffer[i],79,24,176,236);
			i++;
			m_cpBuffer[i]=Contrast(m_cpBuffer[i],79,24,176,236);
			i++;
			m_cpBuffer[i]=Contrast(m_cpBuffer[i],79,24,176,236);
		}	
		m_fFile.SeekToBegin();
		m_fFile.Write(m_cpBuffer,m_dwFileLen);
		m_fFile.Close();
		if(m_cpBuffer!=NULL)
			delete []m_cpBuffer;
	}
}

int CBMPChangeView::Contrast(int Y, int S1, int T1, int S2, int T2)
{
	if(Y<=S1)
	{
		Y=(int)(T1*Y/S1);
	}
	else if(Y>=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;i<m_dwFileLen;i++)
		{
			m_cpBuffer[i]=(int)(106*log(1+m_cpBuffer[i]));
			i++;
			m_cpBuffer[i]=(int)(106*log(1+m_cpBuffer[i]));
			i++;
			m_cpBuffer[i]=(int)(106*log(1+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::OnGraySplit() 
{
	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 S1,S2;
		S1=130;
		S2=200;
		for(DWORD i=54;i<m_dwFileLen;i++)
		{
			if(m_cpBuffer[i]<S1 || m_cpBuffer[i]>S2)
				m_cpBuffer[i]=255;
			else
				m_cpBuffer[i]=0;
			i++;
			if(m_cpBuffer[i]<S1 || m_cpBuffer[i]>S2)
				m_cpBuffer[i]=255;
			else
				m_cpBuffer[i]=0;
			i++;
			if(m_cpBuffer[i]<S1 || 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<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);
		}

		float temp_r[256];
		float temp_g[256];
		float temp_b[256];

		memset(temp_r,0.0f,sizeof(temp_r));
		memset(temp_g,0.0f,sizeof(temp_g));
		memset(temp_b,0.0f,sizeof(temp_b));

		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];
			}
			ns_r[i]=(int)(255.0f*temp_r[i]+0.5f);
			ns_g[i]=(int)(255.0f*temp_g[i]+0.5f);
			ns_b[i]=(int)(255.0f*temp_b[i]+0.5f);
		}
	
		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::OnSml() 
{
	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];
		}
		
		for(i=0;i<256;i++)
		{
			int m_r=0;
			int m_g=0;
			int m_b=0;
			float min_value_r=1.0f;
			float min_value_g=1.0f;
			float min_value_b=1.0f;

			for(int j=0;j<64;j++)
			{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -