📄 rsimagestardoc.cpp
字号:
// RSImageStarDoc.cpp : implementation of the CRSImageStarDoc class
//
#include "stdafx.h"
#include "RSImageStar.h"
#include "RSImageStarDoc.h"
#include "MainFrm.h"
#include "OPenBinDlg.h"
//#include "IFFTDlg.h"
#include "CombineDlg.h"
#include "LayerProDlg.h"
#include "HisMatch.h"
#include "Histrogram.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CRSImageStarDoc
IMPLEMENT_DYNCREATE(CRSImageStarDoc, CDocument)
BEGIN_MESSAGE_MAP(CRSImageStarDoc, CDocument)
//{{AFX_MSG_MAP(CRSImageStarDoc)
ON_COMMAND(ID_IMAGE_INVERSE, OnImageInverse)
ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs)
ON_COMMAND(ID_FILE_SAVE, OnFileSave)
ON_COMMAND(ID_IMAGE_HORINVERSE, OnImageHorinverse)
ON_COMMAND(ID_IMAGE_VERINVERSE, OnImageVerinverse)
ON_COMMAND(ID_IMAGE_LAPLACIAN, OnImageLaplacian)
ON_COMMAND(ID_IMAGE_MEAN, OnImageMean)
ON_COMMAND(ID_IMAGE_MEDIAN, OnImageMedian)
ON_COMMAND(ID_IMAGE_SMOOTH, OnImageSmooth)
ON_COMMAND(ID_IMAGE_GRADS, OnImageGrads)
ON_COMMAND(ID_IMAGE_LOGARITH, OnImageLogarith)
ON_COMMAND(ID_IMAGE_EXPONENT, OnImageExponent)
ON_COMMAND(ID_IMAGE_HISTOGRAM, OnImageHistogram)
ON_COMMAND(ID_IMAGE_TRANFFT, OnImageTranfft)
ON_COMMAND(ID_IMAGE_REVERSE, OnImageReverse)
ON_COMMAND(ID_IMAGE_MAGIC, OnImageMagic)
ON_COMMAND(ID_LAYER_NEW, OnLayerAdd)
ON_COMMAND(ID_LAYER_DELETE, OnLayerDelete)
ON_COMMAND(ID_IMAGINE_CHANNELSPLIT, OnChannelsplit)
ON_COMMAND(ID_IMAGINE_CHANNELCOM, OnImagineChannelcom)
ON_UPDATE_COMMAND_UI(ID_IMAGINE_CHANNELCOM, OnUpdateImagineChannelcom)
ON_UPDATE_COMMAND_UI(ID_IMAGINE_CHANNELSPLIT, OnUpdateChannelsplit)
ON_UPDATE_COMMAND_UI(ID_LAYER_DELETE, OnUpdateLayerDelete)
ON_COMMAND(ID_IMAGE_HISMATCH, OnImageHismatch)
ON_COMMAND(ID_IMAGE_NORMAL, OnImageNormal)
ON_UPDATE_COMMAND_UI(ID_LAYER_NEW, OnUpdateLayerNew)
ON_COMMAND(ID_IMAGE_HISTOGRMSTAT, OnImageHistogrmstat)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CRSImageStarDoc construction/destruction
CRSImageStarDoc::CRSImageStarDoc()
{
// TODO: add one-time construction code here
head=NULL;
curptr=NULL;
pHead=NULL;
pCurPt=NULL;
m_Dib=new CRSImage;
ncount=1;
}
CRSImageStarDoc::~CRSImageStarDoc()
{
Free();
if(m_Dib!=NULL)
delete m_Dib;
}
BOOL CRSImageStarDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CRSImageStarDoc serialization
void CRSImageStarDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
}
/////////////////////////////////////////////////////////////////////////////
// CRSImageStarDoc diagnostics
#ifdef _DEBUG
void CRSImageStarDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CRSImageStarDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CRSImageStarDoc commands
BOOL CRSImageStarDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;
// TODO: Add your specialized creation code here
struct Layer *tempptr;
tempptr=(struct Layer *)malloc(sizeof(struct Layer));
tempptr->dib=NULL;
BOOL bSuccess;
filename=lpszPathName;
CString ext=filename.Right(4);
DeleteContents();
BeginWaitCursor();
if(!ext.CompareNoCase(".JPG"))
{
tempptr->dib=new CRSImageJPEG;
bSuccess = tempptr->dib->Read(lpszPathName);
}
else if(!ext.CompareNoCase(".TIF"))
{
tempptr->dib=new CRSImageTIFF;
bSuccess = tempptr->dib->Read(lpszPathName);
}
else if(!ext.CompareNoCase(".BMP"))
{
tempptr->dib=new CRSImageBMP;
bSuccess = tempptr->dib->Read(lpszPathName);
}
else
{
COpenBinDlg dlg;
if(dlg.DoModal()==IDOK)
{
tempptr->dib=new CRSImage;
CRSImageBIN dib;
dib.width=dlg.m_width;
dib.height=dlg.m_height;
dib.RedChannel=dlg.m_nRed;
dib.GreenChannel=dlg.m_nGreen;
dib.BlueChannel =dlg.m_nBlue;
dib.m_nheadsize=dlg.m_nCount;
dib.nByte=dlg.m_radio+1;
bSuccess = dib.Read(lpszPathName);
if(bSuccess)
tempptr->dib->SetDataPtr(&dib);
else
return false;
}
else
return false;
}
if(tempptr->dib==NULL)
return false;
if (!bSuccess)
{
ReportSaveLoadException(lpszPathName, NULL, FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
return false;
}
if(head==NULL)
{
tempptr->next=NULL;
tempptr->pre=NULL;
tempptr->LUpoint=CPoint(0,0);
tempptr->flagdraw=true;
tempptr->flagwrite=true;
tempptr->color.rgbtRed=255;
tempptr->color.rgbtGreen=255;
tempptr->color.rgbtBlue=255;
strcpy(tempptr->layername,"背 景");
head=tempptr;
curptr=tempptr;
}
m_Dib->SetDataPtr((CRSImage *)tempptr->dib);
size=m_Dib->GetDimensions();
SetPathName(lpszPathName);
SetModifiedFlag(FALSE);
EndWaitCursor();
return true;
}
void CRSImageStarDoc::OnUpdateLayerNew(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(m_Dib!=NULL);
}
void CRSImageStarDoc::Free()
{
tempptr=head;
while(tempptr!=NULL)
{
struct Layer *temp=tempptr;
tempptr=tempptr->next;
if(temp->dib!=NULL)
delete temp->dib;
free(temp);
}
pTempPt=pHead;
while(pTempPt!=NULL)
{
struct Vertex *temp=pTempPt;
pTempPt=pTempPt->next;
free(temp);
}
}
void CRSImageStarDoc::OnImageInverse()
{
// TODO: Add your command handler code here
if(m_Dib!=NULL)
{
BeginWaitCursor();
m_Dib->Inverse();
UpdateAllViews(NULL);
SetModifiedFlag();
EndWaitCursor();
}
}
void CRSImageStarDoc::OnFileSaveAs()
{
// TODO: Add your command handler code here
char szfilter[80]="BMP(*.bmp)|*.bmp|JPG(*.jpg)|*.jpg|TIF(*.tif)|*.tif|Raw(*.raw)|*.raw||";
CString lpszPathName;
CFileDialog fileDialog(false,NULL,NULL,OFN_HIDEREADONLY,szfilter);
// GetSaveFileName(&fileDialog.m_ofn)
fileDialog.m_ofn.lpstrTitle="另保存为";
fileDialog.m_ofn.Flags|=(OFN_OVERWRITEPROMPT|OFN_CREATEPROMPT);
if((fileDialog.DoModal())==IDOK)
{
lpszPathName=fileDialog.GetPathName();
CString str,str1;
if(fileDialog.m_ofn.nFilterIndex==1)
str=".bmp";
else if(fileDialog.m_ofn.nFilterIndex==2)
str=".jpg";
else if(fileDialog.m_ofn.nFilterIndex==3)
str=".tif";
else if (fileDialog.m_ofn.nFilterIndex==4)
str=".raw";
str1=lpszPathName.Right(4);
if(str1.CompareNoCase(str))
lpszPathName+=str;
}
else
return;
CString ext=lpszPathName.Right(4);
DeleteContents();
BeginWaitCursor();
if(!ext.CompareNoCase(".JPG"))
{
CRSImageJPEG Dib;
Dib.SetDataPtr((CRSImage*)m_Dib);
Dib.Write(lpszPathName);
}
else if(!ext.CompareNoCase(".TIF"))
{
CRSImageTIFF Dib;
Dib.SetDataPtr((CRSImage*)m_Dib);
Dib.Write(lpszPathName);
}
else if(!ext.CompareNoCase(".BMP"))
{
CRSImageBMP Dib;
Dib.SetDataPtr((CRSImage*)m_Dib);
Dib.Write(lpszPathName);
}
else
{
CRSImageBIN Dib;
Dib.SetDataPtr((CRSImage*)m_Dib);
Dib.Write(lpszPathName);
}
SetModifiedFlag(FALSE);
EndWaitCursor();
}
void CRSImageStarDoc::OnFileSave()
{
// TODO: Add your command handler code here
if(head!=NULL)
{
BeginWaitCursor();
head->dib->Write(filename);
SetModifiedFlag(FALSE);
EndWaitCursor();
}
}
void CRSImageStarDoc::OnImageHorinverse()
{
// TODO: Add your command handler code here
if(m_Dib!=NULL)
{
BeginWaitCursor();
curptr->dib->HorizontalFlip();
UpdateAllViews(NULL);
SetModifiedFlag();
EndWaitCursor();
}
}
void CRSImageStarDoc::OnImageVerinverse()
{
// TODO: Add your command handler code here
if(m_Dib!=NULL)
{
BeginWaitCursor();
curptr->dib->VerticalFlip();
UpdateAllViews(NULL);
SetModifiedFlag();
EndWaitCursor();
}
}
void CRSImageStarDoc::OnImageLaplacian()
{
// TODO: Add your command handler code here
if(m_Dib!=NULL)
{
BeginWaitCursor();
curptr->dib->LaplacianEdge();
// char matr[3][3]={0,-1,0,-1,4,-1,0,-1,0};
// m_Dib->FindEdgeW3(matr);
UpdateAllViews(NULL);
SetModifiedFlag();
EndWaitCursor();
}
}
void CRSImageStarDoc::OnImageMean()
{
// TODO: Add your command handler code here
if(m_Dib!=NULL)
{
BeginWaitCursor();
char matr[3][3]={1,1,1,1,2,1,1,1,1};
curptr->dib->FilterW3(matr);
UpdateAllViews(NULL);
EndWaitCursor();
SetModifiedFlag();
}
}
void CRSImageStarDoc::OnImageMedian()
{
// TODO: Add your command handler code here
if(m_Dib!=NULL)
{
BeginWaitCursor();
curptr->dib->FilterW3(NULL,1);
UpdateAllViews(NULL);
SetModifiedFlag();
EndWaitCursor();
}
}
void CRSImageStarDoc::OnImageSmooth()
{
// TODO: Add your command handler code here
if(m_Dib!=NULL)
{
BeginWaitCursor();
curptr->dib->FilterW3(NULL,2);
UpdateAllViews(NULL);
SetModifiedFlag();
EndWaitCursor();
}
}
void CRSImageStarDoc::OnImageGrads()
{
// TODO: Add your command handler code here
if(m_Dib!=NULL)
{
BeginWaitCursor();
curptr->dib->FilterW3(NULL,3);
UpdateAllViews(NULL);
SetModifiedFlag();
EndWaitCursor();
}
}
void CRSImageStarDoc::OnImageLogarith()
{
// TODO: Add your command handler code here
if(m_Dib!=NULL)
{
BeginWaitCursor();
curptr->dib->TransForm(0);
UpdateAllViews(NULL);
SetModifiedFlag();
EndWaitCursor();
}
}
void CRSImageStarDoc::OnImageExponent()
{
// TODO: Add your command handler code here
if(m_Dib!=NULL)
{
BeginWaitCursor();
curptr->dib->TransForm(1);
UpdateAllViews(NULL);
SetModifiedFlag();
EndWaitCursor();
}
}
void CRSImageStarDoc::OnImageHistogram()
{
// TODO: Add your command handler code here
if(m_Dib!=NULL)
{
BeginWaitCursor();
if(curptr->dib->HistogramEqu())
{
UpdateAllViews(NULL);
SetModifiedFlag();
}
EndWaitCursor();
}
}
void CRSImageStarDoc::OnImageTranfft()
{
// TODO: Add your command handler code here
if(m_Dib!=NULL)
{
char szfilter[60]="FFT(*.fft)|*.fft||";
char lpszPathName[80];
CFileDialog fileDialog(TRUE,NULL,NULL,OFN_HIDEREADONLY,szfilter);
if((fileDialog.DoModal())==IDOK)
{
CString strPathname=fileDialog.GetPathName();
strcpy(lpszPathName,strPathname);
CString str;
str=strPathname.Right(4);
if(str.CompareNoCase(".fft"))
strcat(lpszPathName,".fft");
}
else
return;
BeginWaitCursor();
curptr->dib->FFT(lpszPathName);
EndWaitCursor();
}
}
void CRSImageStarDoc::OnImageReverse()
{
// TODO: Add your command handler code here
/* if(m_Dib!=NULL)
{
CString lpszPathName;
CIFFTDlg dlg;
if(dlg.DoModal()==IDOK)
{
BeginWaitCursor();
lpszPathName=dlg.m_str2;
curptr->dib->IFFT(dlg.m_str1,dlg.m_str2);
EndWaitCursor();
}
else
return;
}
*/}
void CRSImageStarDoc::OnImageMagic()
{
// TODO: Add your command handler code here
/* if(m_Dib!=NULL)
{
CString lpszPathName;
CIFFTDlg dlg;
if(dlg.DoModal()==IDOK)
{
BeginWaitCursor();
lpszPathName=dlg.m_str2;
curptr->dib->FFTMag(dlg.m_str1,lpszPathName);
EndWaitCursor();
}
else
return;
}
*/}
//以当前激活的图象为背景,打开新的文件作为文件新的图层
void CRSImageStarDoc::OpenLayer(LPCSTR lpszPathName)
{
// TODO: Add your command handler code here
struct Layer *tempptr;
tempptr=(struct Layer *)malloc(sizeof(struct Layer));
tempptr->dib=NULL;
BOOL bSuccess=false;
filename=lpszPathName;
CString ext=filename.Right(4);
BeginWaitCursor();
if(!ext.CompareNoCase(".JPG"))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -