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

📄 bmpdemodoc.cpp

📁 主要是应用VC进行傅立叶变换和反变换的程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// bmpDemoDoc.cpp : implementation of the CBmpDemoDoc class
//

#include "stdafx.h"
#include "bmpDemo.h"

#include "bmpDemoDoc.h"
#include "math.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CBmpDemoDoc

IMPLEMENT_DYNCREATE(CBmpDemoDoc, CDocument)

BEGIN_MESSAGE_MAP(CBmpDemoDoc, CDocument)
	//{{AFX_MSG_MAP(CBmpDemoDoc)
	ON_COMMAND(ID_HCHANGE, OnHchange)
	ON_COMMAND(ID_REVERT, OnRevert)
	ON_COMMAND(ID_VCHANGE, OnVchange)
	ON_COMMAND(ID_CW, OnCw)
	ON_COMMAND(ID_CCW, OnCcw)
	ON_COMMAND(ID_MODULE, OnModule)
	ON_COMMAND(ID_GRAYIZE, OnGrayize)
	ON_COMMAND(ID_HISTOGRAM, OnHistogram)
	ON_COMMAND(ID_ZFTJHS, OnZftjhs)
	ON_COMMAND(ID_BRIGHTEN, OnBrighten)
	ON_COMMAND(ID_DARKEN, OnDarken)
	ON_COMMAND(ID_DFT, OnDft)
	ON_COMMAND(ID_NDFT, OnNdft)
	ON_COMMAND(ID_FFT, OnFft)
	ON_COMMAND(ID_NFFT, OnNfft)
	ON_COMMAND(ID_HPFILTER, OnHpfilter)
	ON_COMMAND(ID_LPFILTER, OnLpfilter)
	ON_COMMAND(ID_BPFILTER, OnBpfilter)
	ON_COMMAND(ID_THPFILTER, OnThpfilter)
	ON_COMMAND(ID_TLPFILTER, OnTlpfilter)
	ON_COMMAND(ID_EXPHPFILTER, OnExphpfilter)
	ON_COMMAND(ID_EXPLPFILTER, OnExplpfilter)
	ON_COMMAND(ID_ENLARGE, OnEnlarge)
	ON_COMMAND(ID_NEGATIVE, OnNegative)
	ON_COMMAND(ID_SinNoise, OnSinNoise)
	ON_COMMAND(ID_ZhongZhiFilter, OnZhongZhiFilter)
	ON_COMMAND(ID_GreyDuiShuBianHuan, OnGreyDuiShuBianHuan)
	ON_COMMAND(ID_ROTATE, OnRotate)
	ON_COMMAND(ID_IMAGEPROPERTY, OnImageproperty)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBmpDemoDoc construction/destruction

CBmpDemoDoc::CBmpDemoDoc()
{
	// TODO: add one-time construction code here
	flag=FALSE;
	UndoFlag=FALSE;
}

CBmpDemoDoc::~CBmpDemoDoc()
{
	if(flag==TRUE)
		delete m_bData;
}

/////////////////////////////////////////////////////////////////////////////
// CBmpDemoDoc serialization

void CBmpDemoDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: add storing code here
	}
	else
	{
		// TODO: add loading code here
	}
}

/////////////////////////////////////////////////////////////////////////////
// CBmpDemoDoc diagnostics

#ifdef _DEBUG
void CBmpDemoDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CBmpDemoDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CBmpDemoDoc commands

BOOL CBmpDemoDoc::OnOpenDocument(LPCTSTR lpszPathName) 
{
	if (!CDocument::OnOpenDocument(lpszPathName))
		return FALSE;

	BeginWaitCursor();
	BOOL a=m_mBmp.Load(lpszPathName); 
	m_mOriBmp=m_mBmp;
	m_mViewBmp=m_mBmp;
	EndWaitCursor();
	return a;

	//打开文件,支持格式为Bmp真彩色,准备支持Jpeg之DCT baseline 格式
}

void CBmpDemoDoc::OnHchange() 
//图象的水平镜向
{
	// TODO: Add your command handler code here
	int width=m_mBmp.GetWidth();
	int height=m_mBmp.GetHeight();
	memBITMAP temp(width,height,m_mBmp);
	for(int i=0;i<width;i++)
	{
		for(int j=0;j<height;j++)
		{
			COLORREF color=m_mBmp.GetPixel(width-i-1,j);
			temp.SetPixel(i,j,color);			
		}
	}
	m_mOldBmp=m_mBmp;
	UndoFlag=TRUE;
	m_mBmp=temp;
	m_mBmp.DataToView(m_mViewBmp);
	SetModifiedFlag(UndoFlag);
}

void CBmpDemoDoc::OnRevert() 
//重新从磁盘上读出图象
{
	// TODO: Add your command handler code here
//	LPCTSTR lpszPathName=(LPCTSTR)GetPathName();
	float scale=m_mBmp.GetScale();
	m_mBmp.Release();
//	m_mBmp.Load(lpszPathName); 
	m_mBmp=m_mOriBmp;
	m_mBmp.SetScale(scale);
	m_mBmp.DataToView(m_mViewBmp);
	flag=FALSE;
	UndoFlag=FALSE;
	SetModifiedFlag(UndoFlag);
}

void CBmpDemoDoc::OnVchange() 
//图象的垂直镜向
{
	// TODO: Add your command handler code here
	int width=m_mBmp.GetWidth();
	int height=m_mBmp.GetHeight();
	memBITMAP temp(width,height,m_mBmp);
	for(int i=0;i<width;i++)
	{
		for(int j=0;j<height;j++)
		{
			COLORREF color=m_mBmp.GetPixel(i,height-1-j);
			temp.SetPixel(i,j,color);			
		}
	}	
	m_mOldBmp=m_mBmp;
	UndoFlag=TRUE;
	m_mBmp=temp;		
	m_mBmp.DataToView(m_mViewBmp);
	SetModifiedFlag(UndoFlag);
}

void CBmpDemoDoc::OnCw() 
//图象逆时针旋转90度
{
	// TODO: Add your command handler code here
	int width=m_mBmp.GetWidth();
	int height=m_mBmp.GetHeight();
	memBITMAP temp(height,width,m_mBmp);
	temp.SetWidth(height);
	temp.SetHeight(width);
	for(int i=0;i<height;i++)
	{
		for(int j=0;j<width;j++)
		{
//			COLORREF color=m_mBmp.GetPixel(i,j);
//			temp.SetPixel(j,width-1-i,color);			
			COLORREF color=m_mBmp.GetPixel(width-1-j,i);
			temp.SetPixel(i,j,color);
		}
	}	
	m_mOldBmp=m_mBmp;
	UndoFlag=TRUE;
	m_mBmp=temp;			
	m_mBmp.DataToView(m_mViewBmp);
	SetModifiedFlag(UndoFlag);
}

void CBmpDemoDoc::OnCcw() 
//图象顺时针旋转90度
{
	// TODO: Add your command handler code here
	int width=m_mBmp.GetWidth();
	int height=m_mBmp.GetHeight();
	memBITMAP temp(height,width,m_mBmp);
	temp.SetWidth(height);
	temp.SetHeight(width);
	for(int i=0;i<height;i++)
	{
		for(int j=0;j<width;j++)
		{
//			COLORREF color=m_mBmp.GetPixel(i,j);
//			temp.SetPixel(height-1-j,i,color);			
			COLORREF color=m_mBmp.GetPixel(j,height-1-i);
			temp.SetPixel(i,j,color);
		}
	}	
	m_mOldBmp=m_mBmp;
	UndoFlag=TRUE;
	m_mBmp=temp;				
	m_mBmp.DataToView(m_mViewBmp);
	SetModifiedFlag(UndoFlag);
}

void CBmpDemoDoc::OnModule() 
//图象空域的模板操作,可实现平滑、锐化等
//可以用于测试各种效果,但对边界部分单独处理
{
	// TODO: Add your command handler code here
	int ModuleData[5][5];
	ModuleData[0][0]=m_ModuleDialog.m_mValue1;
	ModuleData[0][1]=m_ModuleDialog.m_mValue2;
	ModuleData[0][2]=m_ModuleDialog.m_mValue3;
	ModuleData[0][3]=m_ModuleDialog.m_mValue4;
	ModuleData[0][4]=m_ModuleDialog.m_mValue5;

	ModuleData[1][0]=m_ModuleDialog.m_mValue6;
	ModuleData[1][1]=m_ModuleDialog.m_mValue7;
	ModuleData[1][2]=m_ModuleDialog.m_mValue8;
	ModuleData[1][3]=m_ModuleDialog.m_mValue9;
	ModuleData[1][4]=m_ModuleDialog.m_mValue10;

	ModuleData[2][0]=m_ModuleDialog.m_mValue11;
	ModuleData[2][1]=m_ModuleDialog.m_mValue12;
	ModuleData[2][2]=m_ModuleDialog.m_mValue13;
	ModuleData[2][3]=m_ModuleDialog.m_mValue14;
	ModuleData[2][4]=m_ModuleDialog.m_mValue15;

	ModuleData[3][0]=m_ModuleDialog.m_mValue16;
	ModuleData[3][1]=m_ModuleDialog.m_mValue17;
	ModuleData[3][2]=m_ModuleDialog.m_mValue18;
	ModuleData[3][3]=m_ModuleDialog.m_mValue19;
	ModuleData[3][4]=m_ModuleDialog.m_mValue20;

	ModuleData[4][0]=m_ModuleDialog.m_mValue21;
	ModuleData[4][1]=m_ModuleDialog.m_mValue22;
	ModuleData[4][2]=m_ModuleDialog.m_mValue23;
	ModuleData[4][3]=m_ModuleDialog.m_mValue24;
	ModuleData[4][4]=m_ModuleDialog.m_mValue25;

	int i,j,k,l;
	int Total=m_ModuleDialog.m_Var;
	if(Total==0)return;

	int width=m_mBmp.GetWidth();
	int height=m_mBmp.GetHeight();
	memBITMAP temp;
	temp=m_mBmp;

	for(i=2;i<width-2;i++)
	{
		for(j=2;j<height-2;j++)
		{
			int r,g,b;
			r=0 ; g=0 ; b=0 ;
			int kMin,kMax;
			int lMin,lMax;
			kMin=-2; kMax=2;
			lMin=-2; lMax=2;
//			if(kMin+j<0)kMin=-j;
//			if(kMax+j>=height)kMax=height-1-j;
//			if(lMin+i<0)lMin=-i;
//			if(lMax+i>=height)lMax=width-1-i;
			for(k=kMin;k<=kMax;k++)
			{
				for(l=lMin;l<=lMax;l++)
				{
					COLORREF color=m_mBmp.GetPixel(i+l,j+k);
					r+=GetRValue(color)*ModuleData[k+2][l+2];
					g+=GetGValue(color)*ModuleData[k+2][l+2];
					b+=GetBValue(color)*ModuleData[k+2][l+2];
				}
			}
			r/=Total; r=abs(r);
			g/=Total; g=abs(g);
			b/=Total; b=abs(b);
			r=r>255?255:r;
			g=g>255?255:g;
			b=b>255?255:b;
			temp.SetPixel(i,j,RGB(BYTE(r),BYTE(g),BYTE(b)));
		}
	}
	for(i=0;i<width;i++)
	{
		COLORREF color=temp.GetPixel(i,2);
		temp.SetPixel(i,0,color);
		temp.SetPixel(i,1,color);
		color=temp.GetPixel(i,height-3);
		temp.SetPixel(i,height-1,color);
		temp.SetPixel(i,height-2,color);
	}
	for(i=0;i<height;i++)
	{
		COLORREF color=temp.GetPixel(2,i);
		temp.SetPixel(0,i,color);
		temp.SetPixel(1,i,color);
		color=temp.GetPixel(width-3,i);
		temp.SetPixel(width-1,i,color);
		temp.SetPixel(width-2,i,color);
	}
	m_mOldBmp=m_mBmp;
	UndoFlag=TRUE;
	m_mBmp=temp;
	m_mBmp.DataToView(m_mViewBmp);
	SetModifiedFlag(UndoFlag);
}

void CBmpDemoDoc::OnGrayize() 
//将图象变为灰度显示
{
	// TODO: Add your command handler code here
	int width=m_mBmp.GetWidth();
	int height=m_mBmp.GetHeight();
	memBITMAP temp(width,height,m_mBmp);
	for(int i=0;i<width;i++)
	{
		for(int j=0;j<height;j++)
		{
			COLORREF color=m_mBmp.GetPixel(i,j);
			int r=GetRValue(color);
			int g=GetGValue(color);
			int b=GetBValue(color);
			float gray1=float(r)*0.3f+(float)g*0.59f+(float)b*0.11f+0.5f;
			BYTE Gray=(BYTE)gray1;
			temp.SetPixel(i,j,RGB(Gray,Gray,Gray));			
		}
	}	
	m_mOldBmp=m_mBmp;
	UndoFlag=TRUE;
	m_mBmp=temp;				
	m_mBmp.DataToView(m_mViewBmp);
	SetModifiedFlag(UndoFlag);
}

void CBmpDemoDoc::OnHistogram() 
//求图象的灰度直方图,以对话框显示
//同时求出灰度、红、绿、兰四个通道的直方图数据
//数据为全局变量,其具体显示由类ZftDialog处理
{
	// TODO: Add your command handler code here
	long int data[256],rdata[256],gdata[256],bdata[256];
	int i,j;
	for(i=0;i<256;i++)
	{
		data[i]=0L;
		rdata[i]=0L;
		gdata[i]=0L;
		bdata[i]=0L;
	}
	int width=m_mBmp.GetWidth();
	int height=m_mBmp.GetHeight();
	for(i=0;i<width;i++)
	{
		for(j=0;j<height;j++)
		{
			COLORREF color=m_mBmp.GetPixel(i,j);
			int r=GetRValue(color);
			int g=GetGValue(color);
			int b=GetBValue(color);
			float gray1=float(r)*0.3f+(float)g*0.59f+(float)b*0.11f+0.5f;
			BYTE Gray=(BYTE)gray1;
			data[Gray]++;
			rdata[r]++;
			gdata[g]++;
			bdata[b]++;
		}
	}
	long int total=0;
	long int rtotal=0;
	long int gtotal=0;
	long int btotal=0;
	for(i=0;i<256;i++)
	{
		if(data[i]>total)total=data[i];
		if(rdata[i]>rtotal)rtotal=rdata[i];
		if(gdata[i]>gtotal)gtotal=gdata[i];
		if(bdata[i]>btotal)btotal=bdata[i];
	}
	for(i=0;i<256;i++)
	{
		CBmpDemoApp *app=(CBmpDemoApp *)AfxGetApp();
		app->GrayData[i]=(float)data[i]/total;
		app->RedData[i]=(float)rdata[i]/rtotal;
		app->GreenData[i]=(float)gdata[i]/gtotal;
		app->BlueData[i]=(float)bdata[i]/btotal;
	}
}

void CBmpDemoDoc::OnZftjhs() 
//直方图均衡化,其原理参见〈数字图象处理〉教材
//对于彩色图象,此处也只处理成灰度,彩色分别处理,
//其效果并不好;如需处理彩色,注释掉的几行即完成该功能
{
	// TODO: Add your command handler code here
	long int data[256],rdata[256],gdata[256],bdata[256];
	int i,j;
	for(i=0;i<256;i++)
	{
		data[i]=0L;
		rdata[i]=0L;
		gdata[i]=0L;
		bdata[i]=0L;
	}
	int width=m_mBmp.GetWidth();
	int height=m_mBmp.GetHeight();
	for(i=0;i<width;i++)
	{
		for(j=0;j<height;j++)
		{
			COLORREF color=m_mBmp.GetPixel(i,j);
			int r=GetRValue(color);
			int g=GetGValue(color);
			int b=GetBValue(color);
			float gray1=float(r)*0.3f+(float)g*0.59f+(float)b*0.11f+0.5f;
			if(gray1>255)gray1=255;
			BYTE Gray=(BYTE)gray1;
			data[Gray]++;
			rdata[r]++;
			gdata[g]++;
			bdata[b]++;
		}
	}
	long int total=(long)width*height;
	float zft1[256],rzft[256],gzft[256],bzft[256];
	for(i=0;i<256;i++)
	{
		zft1[i]=(float)data[i]/total;
		rzft[i]=(float)rdata[i]/total;
		gzft[i]=(float)gdata[i]/total;
		bzft[i]=(float)bdata[i]/total;
	}
	float count=0.0f;
	float rcount=0.0f;
	float gcount=0.0f;
	float bcount=0.0f;
	for(i=0;i<256;i++)
	{
		count+=zft1[i];
		data[i]=(count*255)>255?255:int(count*255);
		rcount+=rzft[i];
		rdata[i]=int(rcount*255);
		gcount+=gzft[i];
		gdata[i]=int(gcount*255);
		bcount+=bzft[i];
		bdata[i]=int(bcount*255);
	}
	memBitmap temp(width,height,m_mBmp);
	for(i=0;i<width;i++)
	{
		for(j=0;j<height;j++)
		{
			COLORREF color=m_mBmp.GetPixel(i,j);
			int r=GetRValue(color);
			int g=GetGValue(color);
			int b=GetBValue(color);
			float gray1=float(r)*0.3f+(float)g*0.59f+(float)b*0.11f+0.5f;
			if(gray1>255)gray1=255;
			BYTE Gray=(BYTE)gray1;
			BYTE x=(BYTE)data[Gray];
//			r=(BYTE)rdata[r];
//			g=(BYTE)gdata[r];
//			b=(BYTE)bdata[r];
//			temp.SetPixel(i,j,RGB(r,g,b));
			temp.SetPixel(i,j,RGB(x,x,x));
		}
	}
	m_mOldBmp=m_mBmp;
	UndoFlag=TRUE;
	m_mBmp=temp;
	m_mBmp.DataToView(m_mViewBmp);
	SetModifiedFlag(UndoFlag);
}

void CBmpDemoDoc::OnBrighten() 
//图象变亮,红、绿、兰三通道处理
{
	// TODO: Add your command handler code here
	int width=m_mBmp.GetWidth();
	int height=m_mBmp.GetHeight();
	memBitmap temp(width,height,m_mBmp);
	int i,j;
	for(i=0;i<width;i++)
	{
		for(j=0;j<height;j++)
		{
			COLORREF color=m_mBmp.GetPixel(i,j);
			int r=GetRValue(color)+10;
			int g=GetGValue(color)+10;
			int b=GetBValue(color)+10;
			r=r>255?255:r;
			g=g>255?255:g;
			b=b>255?255:b;
			temp.SetPixel(i,j,RGB(BYTE(r),BYTE(g),BYTE(b)));
		}
	}
	m_mOldBmp=m_mBmp;
	UndoFlag=TRUE;
	m_mBmp=temp;	
	m_mBmp.DataToView(m_mViewBmp);
	SetModifiedFlag(UndoFlag);

/*
	int width=m_mBmp.GetWidth();
	int height=m_mBmp.GetHeight();
	memBitmap temp(width,height,m_mBmp);
	int i,j;
	for(i=0;i<width;i++)
	{
		for(j=0;j<height;j++)
		{
			COLORREF color=m_mBmp.GetPixel(i,j);
			int r=GetRValue(color);
			int g=GetGValue(color);
			int b=GetBValue(color);
			temp.SetPixel(i,j,RGB(BYTE(r),BYTE(g),BYTE(b)));
		}
	}
	for(i=width/2-50;i<width/2+50;i++)
	{
		for(j=height/2-50;j<height/2+50;j++)
		{
			COLORREF color=m_mBmp.GetPixel(i,j);
			int r=GetRValue(color)-50;
			int g=GetGValue(color)-50;
			int b=GetBValue(color)-50;
			r=r>255?255:r;
			g=g>255?255:g;
			b=b>255?255:b;
			r=r<0?0:r;
			g=g<0?0:g;
			b=b<0?0:b;
			temp.SetPixel(i,j,RGB(BYTE(r),BYTE(g),BYTE(b)));
		}
	}
	m_mOldBmp=m_mBmp;
	UndoFlag=TRUE;
	m_mBmp=temp;	
	m_mBmp.DataToView(m_mViewBmp);
	SetModifiedFlag(UndoFlag);
	*/

⌨️ 快捷键说明

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