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