📄 bmpdemodoc.cpp
字号:
// 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 + -