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

📄 imagecodesdoc.cpp

📁 VC写的harris角点检测程序。又名plessey
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// ImageCodesDoc.cpp : implementation of the CImageCodesDoc class
//

#include "stdafx.h"
#include "ImageCodes.h"
#include "math.h"

#include "SetThr.h"

#include "ImageCodesDoc.h"
#include<iostream.h>
#include<fstream.h>
#include<stdlib.h>
#include "Harris1.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

unsigned int r0,c0; //r0,c0代表总行数和总列数
unsigned int **GrayValue;//存放灰度值,8位
HWND m_hCapWnd;//图像采集窗口句柄
CCapture dlg;//图像采集窗口对象

/////////////////////////////////////////////////////////////////////////////
// CImageCodesDoc

IMPLEMENT_DYNCREATE(CImageCodesDoc, CDocument)

BEGIN_MESSAGE_MAP(CImageCodesDoc, CDocument)
	//{{AFX_MSG_MAP(CImageCodesDoc)
	ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
	ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs)
	ON_COMMAND(ID_PROCESS_DATAOUT, OnProcessDataout)
	ON_COMMAND(ID_PROCESS_GRAY, OnProcessGray)
	ON_COMMAND(ID_PROCESS_RECOVER, OnProcessRecover)
	ON_COMMAND(ID_PROCESS_SOBEL, OnProcessSobel)
	ON_COMMAND(ID_PROCESS_LAP, OnProcessLap)
	ON_COMMAND(ID_PROCESS_AVE, OnProcessAve)
	ON_COMMAND(ID_PROCESS_HOR, OnProcessHor)
	ON_COMMAND(ID_PROCESS_HV, OnProcessHv)
	ON_COMMAND(ID_PROCESS_MID, OnProcessMid)
	ON_COMMAND(ID_PROCESS_RUI, OnProcessRui)
	ON_COMMAND(ID_PROCESS_VER, OnProcessVer)
	ON_COMMAND(ID_PROCESS_ERZHIHUA, OnProcessErzhihua)
	ON_COMMAND(ID_PROCESS_ROBERT, OnProcessRobert)
	ON_UPDATE_COMMAND_UI(ID_PROCESS_GRAY, OnUpdateProcessGray)
	ON_UPDATE_COMMAND_UI(ID_PROCESS_ERZHIHUA, OnUpdateProcessErzhihua)
	ON_UPDATE_COMMAND_UI(ID_PROCESS_AVE, OnUpdateProcessAve)
	ON_UPDATE_COMMAND_UI(ID_PROCESS_DATAOUT, OnUpdateProcessDataout)
	ON_UPDATE_COMMAND_UI(ID_PROCESS_HOR, OnUpdateProcessHor)
	ON_UPDATE_COMMAND_UI(ID_PROCESS_HV, OnUpdateProcessHv)
	ON_UPDATE_COMMAND_UI(ID_PROCESS_LAP, OnUpdateProcessLap)
	ON_UPDATE_COMMAND_UI(ID_PROCESS_MID, OnUpdateProcessMid)
	ON_UPDATE_COMMAND_UI(ID_PROCESS_RECOVER, OnUpdateProcessRecover)
	ON_UPDATE_COMMAND_UI(ID_PROCESS_ROBERT, OnUpdateProcessRobert)
	ON_UPDATE_COMMAND_UI(ID_PROCESS_RUI, OnUpdateProcessRui)
	ON_UPDATE_COMMAND_UI(ID_PROCESS_SOBEL, OnUpdateProcessSobel)
	ON_UPDATE_COMMAND_UI(ID_PROCESS_VER, OnUpdateProcessVer)
	ON_UPDATE_COMMAND_UI(ID_FILE_SAVE_AS, OnUpdateFileSaveAs)
	ON_COMMAND(ID_PROCESS_CONVERT, OnProcessConvert)
	ON_COMMAND(ID_PROCESS_GRAY1, OnProcessGray1)
	ON_COMMAND(ID_PROCESS_AVE1, OnProcessAve1)
	ON_COMMAND(ID_PROCESS_CONVERT1, OnProcessConvert1)
	ON_COMMAND(ID_PROCESS_ERZHIHUA1, OnProcessErzhihua1)
	ON_COMMAND(ID_PROCESS_HOR1, OnProcessHor1)
	ON_COMMAND(ID_PROCESS_HV1, OnProcessHv1)
	ON_COMMAND(ID_PROCESS_LAP1, OnProcessLap1)
	ON_COMMAND(ID_PROCESS_MID1, OnProcessMid1)
	ON_COMMAND(ID_PROCESS_ROBERT1, OnProcessRobert1)
	ON_COMMAND(ID_PROCESS_RUI1, OnProcessRui1)
	ON_COMMAND(ID_PROCESS_SOBEL1, OnProcessSobel1)
	ON_COMMAND(ID_PROCESS_VER1, OnProcessVer1)
	ON_UPDATE_COMMAND_UI(ID_FILE_SAVE, OnUpdateFileSave)
	ON_UPDATE_COMMAND_UI(ID_PROCESS_AVE1, OnUpdateProcessAve1)
	ON_UPDATE_COMMAND_UI(ID_PROCESS_CONVERT1, OnUpdateProcessConvert1)
	ON_UPDATE_COMMAND_UI(ID_PROCESS_ERZHIHUA1, OnUpdateProcessErzhihua1)
	ON_UPDATE_COMMAND_UI(ID_PROCESS_GRAY1, OnUpdateProcessGray1)
	ON_UPDATE_COMMAND_UI(ID_PROCESS_HOR1, OnUpdateProcessHor1)
	ON_UPDATE_COMMAND_UI(ID_PROCESS_HV1, OnUpdateProcessHv1)
	ON_UPDATE_COMMAND_UI(ID_PROCESS_LAP1, OnUpdateProcessLap1)
	ON_UPDATE_COMMAND_UI(ID_PROCESS_MID1, OnUpdateProcessMid1)
	ON_UPDATE_COMMAND_UI(ID_PROCESS_ROBERT1, OnUpdateProcessRobert1)
	ON_UPDATE_COMMAND_UI(ID_PROCESS_RUI1, OnUpdateProcessRui1)
	ON_UPDATE_COMMAND_UI(ID_PROCESS_SOBEL1, OnUpdateProcessSobel1)
	ON_UPDATE_COMMAND_UI(ID_PROCESS_VER1, OnUpdateProcessVer1)
	ON_UPDATE_COMMAND_UI(ID_PROCESS_CONVERT, OnUpdateProcessConvert)
	ON_COMMAND(ID_POINT_ENHANCE, OnPointEnhance)
	ON_COMMAND(ID_POINT_ENHANCE1, OnPointEnhance1)
	ON_COMMAND(ID_PINGHUA_K, OnPinghuaK)
	ON_COMMAND(ID_PINGHUA_K1, OnPinghuaK1)
	ON_COMMAND(ID_PINGHUA_CHAO, OnPinghuaChao)
	ON_COMMAND(ID_PINGHUA_CHAO1, OnPinghuaChao1)
	ON_COMMAND(ID_POINT_STRETCH, OnPointStretch)
	ON_COMMAND(ID_POINT_STRETCH1, OnPointStretch1)
	ON_COMMAND(ID_POINT_WINDOW, OnPointWindow)
	ON_COMMAND(ID_POINT_WINDOW1, OnPointWindow1)
	ON_UPDATE_COMMAND_UI(ID_PINGHUA_CHAO, OnUpdatePinghuaChao)
	ON_UPDATE_COMMAND_UI(ID_PINGHUA_CHAO1, OnUpdatePinghuaChao1)
	ON_UPDATE_COMMAND_UI(ID_PINGHUA_K, OnUpdatePinghuaK)
	ON_UPDATE_COMMAND_UI(ID_PINGHUA_K1, OnUpdatePinghuaK1)
	ON_UPDATE_COMMAND_UI(ID_POINT_ENHANCE, OnUpdatePointEnhance)
	ON_UPDATE_COMMAND_UI(ID_POINT_ENHANCE1, OnUpdatePointEnhance1)
	ON_UPDATE_COMMAND_UI(ID_POINT_STRETCH, OnUpdatePointStretch)
	ON_UPDATE_COMMAND_UI(ID_POINT_STRETCH1, OnUpdatePointStretch1)
	ON_UPDATE_COMMAND_UI(ID_POINT_WINDOW, OnUpdatePointWindow)
	ON_UPDATE_COMMAND_UI(ID_POINT_WINDOW1, OnUpdatePointWindow1)
	ON_UPDATE_COMMAND_UI(ID_EDGE_PREWITT, OnUpdateEdgePrewitt)
	ON_COMMAND(ID_EDGE_PREWITT1, OnEdgePrewitt1)
	ON_COMMAND(ID_EDGE_PREWITT, OnEdgePrewitt)
	ON_UPDATE_COMMAND_UI(ID_EDGE_PREWITT1, OnUpdateEdgePrewitt1)
	ON_COMMAND(ID_PROCESS_MAXL, OnProcessMaxl)
	ON_UPDATE_COMMAND_UI(ID_PROCESS_MAXL, OnUpdateProcessMaxl)
	ON_COMMAND(ID_PROCESS_MAXL1, OnProcessMaxl1)
	ON_UPDATE_COMMAND_UI(ID_PROCESS_MAXL1, OnUpdateProcessMaxl1)
	ON_COMMAND(ID_XING_H, OnXingH)
	ON_COMMAND(ID_XING_V, OnXingV)
	ON_COMMAND(ID_XING_FANG, OnXingFang)
	ON_UPDATE_COMMAND_UI(ID_XING_FANG, OnUpdateXingFang)
	ON_UPDATE_COMMAND_UI(ID_XING_H, OnUpdateXingH)
	ON_UPDATE_COMMAND_UI(ID_XING_V, OnUpdateXingV)
	ON_COMMAND(ID_XING_H1, OnXingH1)
	ON_COMMAND(ID_XING_FANG1, OnXingFang1)
	ON_COMMAND(ID_XING_V1, OnXingV1)
	ON_UPDATE_COMMAND_UI(ID_XING_FANG1, OnUpdateXingFang1)
	ON_UPDATE_COMMAND_UI(ID_XING_H1, OnUpdateXingH1)
	ON_UPDATE_COMMAND_UI(ID_XING_V1, OnUpdateXingV1)
	ON_COMMAND(ID_PENG_H, OnPengH)
	ON_UPDATE_COMMAND_UI(ID_PENG_H, OnUpdatePengH)
	ON_COMMAND(ID_PENG_H1, OnPengH1)
	ON_UPDATE_COMMAND_UI(ID_PENG_H1, OnUpdatePengH1)
	ON_COMMAND(ID_PENG_FANG, OnPengFang)
	ON_UPDATE_COMMAND_UI(ID_PENG_FANG, OnUpdatePengFang)
	ON_COMMAND(ID_PENG_V, OnPengV)
	ON_COMMAND(ID_PENG_V1, OnPengV1)
	ON_UPDATE_COMMAND_UI(ID_PENG_V1, OnUpdatePengV1)
	ON_UPDATE_COMMAND_UI(ID_PENG_V, OnUpdatePengV)
	ON_UPDATE_COMMAND_UI(ID_PENG_FANG1, OnUpdatePengFang1)
	ON_COMMAND(ID_PENG_FANG1, OnPengFang1)
	ON_COMMAND(ID_OPEN_FANG, OnOpenFang)
	ON_COMMAND(ID_OPEN_FANG1, OnOpenFang1)
	ON_COMMAND(ID_OPEN_H, OnOpenH)
	ON_COMMAND(ID_OPEN_H1, OnOpenH1)
	ON_COMMAND(ID_OPEN_V, OnOpenV)
	ON_COMMAND(ID_OPEN_V1, OnOpenV1)
	ON_COMMAND(ID_CLOSE_FANG, OnCloseFang)
	ON_COMMAND(ID_CLOSE_FANG1, OnCloseFang1)
	ON_COMMAND(ID_CLOSE_H, OnCloseH)
	ON_COMMAND(ID_CLOSE_H1, OnCloseH1)
	ON_COMMAND(ID_CLOSE_V, OnCloseV)
	ON_COMMAND(ID_CLOSE_V1, OnCloseV1)
	ON_UPDATE_COMMAND_UI(ID_CLOSE_FANG, OnUpdateCloseFang)
	ON_UPDATE_COMMAND_UI(ID_CLOSE_FANG1, OnUpdateCloseFang1)
	ON_UPDATE_COMMAND_UI(ID_CLOSE_H, OnUpdateCloseH)
	ON_UPDATE_COMMAND_UI(ID_CLOSE_H1, OnUpdateCloseH1)
	ON_UPDATE_COMMAND_UI(ID_CLOSE_V, OnUpdateCloseV)
	ON_UPDATE_COMMAND_UI(ID_CLOSE_V1, OnUpdateCloseV1)
	ON_UPDATE_COMMAND_UI(ID_OPEN_FANG, OnUpdateOpenFang)
	ON_UPDATE_COMMAND_UI(ID_OPEN_FANG1, OnUpdateOpenFang1)
	ON_UPDATE_COMMAND_UI(ID_OPEN_H, OnUpdateOpenH)
	ON_UPDATE_COMMAND_UI(ID_OPEN_H1, OnUpdateOpenH1)
	ON_UPDATE_COMMAND_UI(ID_OPEN_V, OnUpdateOpenV)
	ON_UPDATE_COMMAND_UI(ID_OPEN_V1, OnUpdateOpenV1)
	ON_COMMAND(ID_CONECT, OnConect)
	ON_COMMAND(ID_DISCONECT, OnDisconect)
	ON_COMMAND(ID_READ_CAPTURE, OnReadCapture)
	ON_UPDATE_COMMAND_UI(ID_READ_CAPTURE, OnUpdateReadCapture)
	ON_COMMAND(ID_PROCESS_AMAXL, OnProcessAmaxl)
	ON_COMMAND(ID_PROCESS_BESTMAX, OnProcessBestmax)
	ON_UPDATE_COMMAND_UI(ID_PROCESS_BESTMAX, OnUpdateProcessBestmax)
	ON_UPDATE_COMMAND_UI(ID_PROCESS_AMAXL, OnUpdateProcessAmaxl)
	ON_COMMAND(ID_DETECT, OnDetect)
	ON_UPDATE_COMMAND_UI(ID_DETECT, OnUpdateDetect)
	ON_UPDATE_COMMAND_UI(ID_DISCONECT, OnUpdateDisconect)
	ON_UPDATE_COMMAND_UI(ID_CONECT, OnUpdateConect)
	ON_COMMAND(ID_SETSOURCE, OnSetsource)
	ON_UPDATE_COMMAND_UI(ID_SETSOURCE, OnUpdateSetsource)
	ON_COMMAND(ID_PROCESS_HOUGH, OnProcessHough)
	ON_COMMAND(ID_PROCESS_HOUGH1, OnProcessHough1)
	ON_UPDATE_COMMAND_UI(ID_PROCESS_HOUGH1, OnUpdateProcessHough1)
	ON_UPDATE_COMMAND_UI(ID_PROCESS_HOUGH, OnUpdateProcessHough)
	ON_COMMAND(ID_DETECT2, OnDetect2)
	ON_UPDATE_COMMAND_UI(ID_DETECT2, OnUpdateDetect2)
	ON_COMMAND(ID_HARRIS, OnHarris)
	ON_UPDATE_COMMAND_UI(ID_HARRIS, OnUpdateHarris)
	//}}AFX_MSG_MAP
	ON_UPDATE_COMMAND_UI(ID_INDICATOR_IMAG, OnUpdateImageInfo)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CImageCodesDoc construction/destruction

CImageCodesDoc::CImageCodesDoc()
{
	m_Harris=FALSE;
    m_hCapWnd=NULL;
	DIB = NULL;
	hBitmap = NULL;
	alpha_bg = BG_NONE;
	trans=NULL;//存放原始图像的RGB像素值
	convo=NULL;//存放处理后要显示的图像的灰度值矩阵
	back=NULL;//一维数组,要想显示convo,必须把其转化为一维的,放到back中,再拷贝到bits中
	GrayValue=NULL;//存放原始图像的灰度值矩阵
	r0=0;//原始图像的总行数
	c0=0;//原始图像的总列数
	erflag=false;//表征原始图像是否经过二值化
	transflag=false;//表征trans中是否有有了原始图像的RGB值
	Grayflag=false;//表征GrayValue中是否存了原始图像的灰度值
	convoflag=false;//表征convo中是否有了值
	xingflag=false;//表征原始图像是否经过了形态学变换
	label=false;//表征当前处理是对原始图进行还是对当前图进行
	connectflag=false;//表征当前是否连接了抓图窗口
	InitBMGImage(&img);//初始化结构体对象img  
	mHArrow=AfxGetApp()->LoadStandardCursor(IDC_ARROW);
	mHWait=AfxGetApp()->LoadStandardCursor(IDC_WAIT);

}

CImageCodesDoc::~CImageCodesDoc()
{
	for(unsigned int r=0;r<r0;r++)//析构动态开辟的二维数组
		delete []trans[r];
	delete []trans;

	for( r=0;r<r0;r++)
		   delete []convo[r];
	     delete []convo;

	for( r=0;r<r0;r++)
		   delete []GrayValue[r];
	     delete []GrayValue;

	delete []back;//释放一维数组


	FreeBMGImage( &img );//释放结构体对象
    if(connectflag==TRUE)//如果连接了抓图窗口
	{
	   PV_DeInitHW();//断开与驱动器的连接
	   capDriverDisconnect(m_hCapWnd);
	   DestroyWindow(dlg);//销毁抓图窗口——无模式对话框
	}
}

BOOL CImageCodesDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	// TODO: add reinitialization code here
	// (SDI documents will reuse this document)

	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CImageCodesDoc serialization

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

/////////////////////////////////////////////////////////////////////////////
// CImageCodesDoc diagnostics

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

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

/////////////////////////////////////////////////////////////////////////////
// CImageCodesDoc commands

void CImageCodesDoc::OnFileOpen() 
{
	if(trans!=NULL) Free();//如果不是第一次打开图像,需要调用Free释放上一张图片占用的空间

	CFileDialog d( TRUE, NULL, NULL, OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST,
		_T("All Image Files|*.tif;*.jpg;*.png;*.bmp;*.rgb;*.rgba;*.cel;*.tga;*.gif|TIFF Files (*.tif)|*.tif|JPEG Files (*.jpg)|*.jpg|PNG Files (*.png)|*.png|Windows BMP Files (*.bmp)|*.bmp|SGI RGB Files (*.rgb[a])|*.rgb;*.rgba|Animator Files (*.cel)|*.cel|Targa Files (*.tga)|*.tga|GIF Files (*.gif)|*.gif||"),
		NULL );

	if ( d.DoModal() == IDOK )
	{
		AfxGetApp()->m_pMainWnd->SetWindowText(d.GetFileName());
		newFile = TRUE;
		int AlphaComp;
		switch (alpha_bg)
		{
		default:
		case BG_NONE:
			AlphaComp = 0;
			break;
		case BG_COLOR:
			AlphaComp = 1;
			break;
		case BG_IMAGE:
		case BG_BITMAP:
			AlphaComp = 2;
			break;

		}		

		if ( d.GetFileExt() == "tif" || d.GetFileExt() == "TIF" )
		{
			struct TIFFInfoStruct info;
			hBitmap = CreateBitmapFromFile( d.GetFileName(), (void *)&info, AlphaComp );
			compression = info.compression;
			photometric = info.photometric;
			orientation = info.orientation;
			predictor = info.predictor;
			FileType = IF_TIFF;
		}
		else if ( d.GetFileExt() == "jpg" || d.GetFileExt() == "JPG" )
		{
			hBitmap = CreateBitmapFromFile( d.GetFileName(), NULL, 0 );
			FileType = IF_JPEG;
		}
		else if ( d.GetFileExt() == "png" || d.GetFileExt() == "PNG" )
		{
			hBitmap = CreateBitmapFromFile( d.GetFileName(), NULL, AlphaComp );
			FileType = IF_PNG;
		}
		else if ( d.GetFileExt() == "bmp" || d.GetFileExt() == "BMP" )
		{
			hBitmap = CreateBitmapFromFile( d.GetFileName(), NULL, 0 );
			FileType = IF_BMP;
		}
		else if ( d.GetFileExt() == "cel" || d.GetFileExt() == "CEL" )
		{
			hBitmap = CreateBitmapFromFile( d.GetFileName(), NULL, 0 );
			FileType = IF_CEL;
		}
		else if ( d.GetFileExt() == "tga" || d.GetFileExt() == "TGA" )
		{
			hBitmap = CreateBitmapFromFile( d.GetFileName(), NULL, AlphaComp );
			FileType = IF_TGA;
		}
		else if ( d.GetFileExt() == "gif" || d.GetFileExt() == "GIF" )
		{
			hBitmap = CreateBitmapFromFile( d.GetFileName(), NULL, AlphaComp );
			FileType = IF_GIF;
		}
		else if ( d.GetFileExt() == "rgb" || d.GetFileExt() == "RGB" || 
			      d.GetFileExt() == "rgba" || d.GetFileExt() == "RGBA" )
		{
			hBitmap = CreateBitmapFromFile( d.GetFileName(), NULL, AlphaComp );
			FileType = IF_RGB;
		}	
	}
	show();//显示打开的图像
	Reply();//为新打开的图像申请内存空间
}
void CImageCodesDoc::Free() 
{
		transflag=false;//成员变量复原
		Grayflag=false;
		convoflag=false;
		label=false;
		xingflag=false;
		erflag=false;

	    for(unsigned int r=0;r<r0;r++)//释放空间
		   delete []trans[r];
	     delete []trans;
		 trans=NULL;

		for(r=0;r<r0;r++)
		   delete []GrayValue[r];
	     delete []GrayValue;
		 	GrayValue=NULL;
	
	    for(r=0;r<r0;r++)
		   delete []convo[r];
	     delete []convo;
		 	convo=NULL;

		delete []back,back=NULL;
}

void CImageCodesDoc::Reply() 
{

//一旦读出图像就可以动态开辟二维数组了

	unsigned int r=0,c=0;//r,c,分别代表行、列;

	//用hBitmap所指的图像给img赋值
	GetDataFromBitmap(hBitmap,&img,1); //把打开图像的信息拷贝到img中      	
        
	if(img.bits_per_pixel!=24)//如果打开的图像不是24位真彩色就先转化为24位真彩色
	{
		struct BMGImageStruct imgout;
		InitBMGImage(&imgout);
		ConvertPaletteToRGB(img,&imgout);
		CopyBMGImage( imgout,&img);
		FreeBMGImage( &imgout);
    }	

  	  r0=img.height;//给全局变量r0、c0赋值
	  c0=img.scan_width/(img.bits_per_pixel/8);

      trans=new unsigned int *[r0];//动态给数组申请空间
      for(unsigned int j=0;j<r0;j++)
  	   trans[j]=new unsigned int[c0];

//convo用来存放改变后的象素值,它是根据trans和GrayValue
//求出特殊效果的象素值,转化后再显示。
	  convo=new unsigned int *[r0];
      for( j=0;j<r0;j++)
  	   convo[j]=new unsigned int[c0];

	   GrayValue=new unsigned int *[r0];
      for( j=0;j<r0;j++)
  	   GrayValue[j]=new unsigned int[c0];

      back=new unsigned char[r0*c0*3];
      if(!back) exit(1);

	  for(r=0;r<r0;r++)//初始化trans,convo,GrayValue
			for(c=0;c<c0;c++)
				trans[r][c]=0,convo[r][c]=0,GrayValue[r][c]=255;
			
	   for(j=0;j<r0*c0*3;j++) back[j]=0;//初始化back


}

void CImageCodesDoc::OnFileSaveAs() 
{
	 ::SetCursor(mHWait);

	if (DIB == NULL)                      // check DIB to determine save operation 
	{
		AfxGetApp()->m_pMainWnd->MessageBox("No image!", "Warning", MB_ICONSTOP);
		return;
	}
    
	CFileDialog o( FALSE, "*.tif", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
	_T("TIFF Files (*.tif)|*.tif|JPEG Files (*.jpg)|*.jpg|PNG Files (*.png)|*.png|SGI RGB Files (*.rgb[a])|*.rgb;*.rgba|BMP File (*.bmp)|*.bmp||"),
	NULL );

    if ( o.DoModal() == IDOK )
    {
		AfxGetApp()->m_pMainWnd->SetWindowText(o.GetFileName());
		if ( o.GetFileExt() == "tif" || o.GetFileExt() == "TIF" )
		{
			struct TIFFInfoStruct info;
			if ( FileType != IF_TIFF )
			{
				info.compression = ZIP;
				info.photometric = RGB;
				info.predictor = 0;
			}
			else
			{
				info.compression = ZIP;
				info.photometric = RGB;
				info.predictor = 0;
			}

			// Thank you UNISYS!
			if ( compression == LZW )
			{
				AfxGetApp()->m_pMainWnd->MessageBox("Compression changed from LZW to ZIP","Thank You, UNISYS!",MB_OK);
				info.compression = ZIP;
				info.predictor = 0;
			}

			if ( SaveBitmapToFileEx( DIB->GetSafeHandle(),
							  (LPCSTR)o.GetFileName(),
							  &info ) != BMG_OK )
			{
				const char *msg;
				GetLastBMGErrorMessage( &msg );
				AfxGetApp()->m_pMainWnd->MessageBox( msg, "BMG error", MB_OK | MB_ICONERROR );
			}
		}
		else if ( o.GetFileExt() == "jpg" || o.GetFileExt() == "JPG" )
		{
			int GrayScale = 0;
			int quality = 100;
			if ( FileType != IF_JPEG )
			{
				quality = 100;
			}

			if ( SaveBitmapToFileEx( DIB->GetSafeHandle(), (LPCSTR)o.GetFileName(), 
				 &quality ) != BMG_OK )
			{
				const char *msg;
				GetLastBMGErrorMessage( &msg );
				AfxGetApp()->m_pMainWnd->MessageBox( msg, "BMG error", MB_OK | MB_ICONERROR );
			}
		}
		else 
		{
			if ( SaveBitmapToFileEx( DIB->GetSafeHandle(), 
				 (LPCSTR)o.GetFileName(), 0 ) != BMG_OK )
			{
				const char *msg;
				GetLastBMGErrorMessage( &msg );
				AfxGetApp()->m_pMainWnd->MessageBox( msg, "BMG error", MB_OK | MB_ICONERROR );
			}
		}
	}
	 ::SetCursor(mHArrow);

}

void CImageCodesDoc::OnUpdateImageInfo(CCmdUI * pCmdUI)
{
	pCmdUI->Enable();

⌨️ 快捷键说明

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