www.pudn.com > RSImageManger.rar > Image.cpp


 
#include "stdafx.h" 
#include "GeocodeDlg.h" 
#include "FinDlg.h" 
#include "afxtempl.h" 
 
#include "ImageManger.h" 
//#include "IMGManger.h" 
#include  
#include  
#include "Image.h" 
 
 
/* Handle to a DIB */ 
 
DECLARE_HANDLE(HDIB); 
 
CImageDe::CImageDe() 
{ 
	  m_pData=NULL; 
	  mBoxImage=NULL;		 
	  m_rgbquad=NULL; 
	  pMapFile1=NULL; 
	  hFile1=NULL; 
	  hFile=NULL; 	 
	  IsDomTrue=0; 
	  m_outdexdm=100; 
} 
CImageDe::~CImageDe() 
{ 
    if(m_pData != NULL) 
	{ 
		delete []m_pData;  // There seems some problem?  
		m_pData = NULL; 
	} 
	if(mBoxImage != NULL)	 
	{ 
		delete []mBoxImage;	 
		mBoxImage=NULL; 
	} 
	 
	if(m_rgbquad != NULL)	//这个数组是个全局变量,用new开辟别的数组,赋值给它 
	{ 
		delete []m_rgbquad;	 
		m_rgbquad=NULL; 
	} 
	 
	 
} 
 
/////////////////////////////////////////////////////////////////////////////// 
//Function :读24位与8位图象,并建立图象索引 
//参数: 
//	FileName:BMP文件名 
//	m_pData 原始图象的指针数组 
//	temp  分块图象的指针数组 
//  dm 每块的像素大小 
/////////////////////////////////////////////////////////////////////////////// 
 
 
BOOL CImageDe::OnReadBMP(CString FileName) //重组织图象reproduce image 
{ 
    
	 
	m_CurFileName=FileName; 
 
/*		if(NULL != m_pData) 
	{ 
		delete [] m_pData; 
		m_pData = NULL; 
	} 
	*/ 
		if(NULL != mBoxImage) 
	{ 
		delete [] mBoxImage; 
		mBoxImage = NULL; 
	} 
    long i, j;	 
    BITMAPFILEHEADER bitmapfileheader; 
	BITMAPINFOHEADER bitmapinfoheader; 
	RGBQUAD *rgbquad; 
	BITMAPCOREHEADER bitmapcoreheader; 
    RGBTRIPLE  *rgbtriple; 
	int high,rgbwide,rgbhigh; 
     
	short Width, Height, nBitCount; 
	WORD size; 
	BOOL bIsWin3x; 
    unsigned char out=0; 
  
    unsigned char a[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};  //the mask to get the bit of the 2-value image  
    unsigned char b[2]={0xf0,0x0f}; //the mask to get the bit of the 16-color image  
    short RowByteNum;  //the bytes of each row   
    
	unsigned char *image = NULL;     //store the bytes of the image 
	FILE *fp; 
	rgbquad=new RGBQUAD[256];   //palette 
    rgbtriple=new RGBTRIPLE[256]; //palette 
	if((fp=fopen(m_CurFileName,"rb"))==NULL) 
	{ 
		 
		delete [] rgbquad; 
		delete [] rgbtriple; 
		return FALSE; 
	} 
	i=0; 
	fread(&bitmapfileheader,sizeof(BITMAPFILEHEADER),1,fp); 
	if(bitmapfileheader.bfType!=0x4D42)	AfxMessageBox("非法bmp文件"); 
	fread(&size,2,1,fp); 
	if(size==sizeof(BITMAPINFOHEADER))	 bIsWin3x=TRUE; 
	else bIsWin3x=FALSE; 
    fseek(fp,-2,SEEK_CUR); 
 
	if(bIsWin3x)  //new version 
	{ 
		fread(&bitmapinfoheader,sizeof(BITMAPINFOHEADER),1,fp); 
        Width=(short)bitmapinfoheader.biWidth; 
		Height=(short)bitmapinfoheader.biHeight; 
        nBitCount=bitmapinfoheader.biBitCount;         
		if(Height<0)  
		{ 
		   AfxMessageBox("Invalid BMP format"); 
			delete [] rgbquad; 
			delete [] rgbtriple; 
		   return FALSE; 
		}		 
		if(bitmapinfoheader.biCompression!=0) 
		{ 
			AfxMessageBox("Invalid BMP format"); 
	       delete [] rgbquad; 
		   delete [] rgbtriple; 
			return FALSE; 
		} 
	} 
	else 
	{ 
		fread(&bitmapcoreheader,sizeof(BITMAPCOREHEADER),1,fp); 
        Width=(short)bitmapcoreheader.bcWidth; 
		Height=(short)bitmapcoreheader.bcHeight; 
        if(Height<0)  
		{ 
		   AfxMessageBox("Invalid BMP format"); 
		   delete [] rgbquad; 
		   delete [] rgbtriple; 
		   return FALSE; 
		} 
		nBitCount=bitmapcoreheader.bcBitCount; 
 
	} 
	    high = Height; 
    	int rest; 
	    rest=int(fmod(Width*nBitCount,32)); 
		if(rest!=0) 
		 RowByteNum=((Width*nBitCount)+31)/32*4;     
		//RowByteNum=(Width*nBitCount)/8+4;    	 
		else 
		RowByteNum=(Width*nBitCount)/8;    	 
 
	long jj= (long)Height*(long)RowByteNum; 
   	image=new unsigned char[jj]; 
    CWaitCursor wait; 
	rgbwide = Width * 3; 
	rgbhigh = high; 
   if(bIsWin3x) 
   {      
      switch(nBitCount) 
	  { 
	   case 1: 
		 fread(image,jj,1,fp); 
		 break;		   
    	   case 4: 
		   for(i=0;i<16;i++) 
		   { 
		      fread(&rgbquad[i].rgbBlue,1,1,fp); 
              fread(&rgbquad[i].rgbGreen,1,1,fp); 
			  fread(&rgbquad[i].rgbRed,1,1,fp); 
			  fread(&rgbquad[i].rgbReserved,1,1,fp);               
		   }  
          fread(image,jj,1,fp); 
		  break; 
          case 8:		    
		  for(i=0;i<256;i++) 
		  {   
              fread(&rgbquad[i].rgbBlue,1,1,fp); 
              fread(&rgbquad[i].rgbGreen,1,1,fp); 
			  fread(&rgbquad[i].rgbRed,1,1,fp); 
			  fread(&rgbquad[i].rgbReserved,1,1,fp); 
          }           
          fread(image,jj,1,fp); 
		     break; 
	  case 24: 
		  fread(image,jj,1,fp); 
		  break; 
	  default: break; 
	 } 
   } 
   else   //if BMP file is old version 
   { 
      switch(nBitCount) 
	  { 
	   case 1: 
		 fread(image,jj,1,fp); 
		 break;		   
	   case 4: 
		   for(i=0;i<16;i++) 
		   { 
		      fread(&rgbquad[i].rgbBlue,1,1,fp); 
              fread(&rgbquad[i].rgbGreen,1,1,fp); 
			  fread(&rgbquad[i].rgbRed,1,1,fp); 
			  fread(&rgbquad[i].rgbReserved,1,1,fp);               
		   }  
          fread(image,jj,1,fp); 
		  break; 
          case 8: 
		   for(i=0;i<256;i++) 
		   { 
              fread(&rgbtriple[i].rgbtBlue,1,1,fp); 
              fread(&rgbtriple[i].rgbtGreen,1,1,fp); 
			  fread(&rgbtriple[i].rgbtRed,1,1,fp); 
		   } 
		   fread(image,jj,1,fp); 
	       break; 
	  case 24: 
          fread(image,jj,1,fp); 
		   break; 
	  default: break; 
	 } 
   } 
 
 
   delete [] rgbquad; 
   delete [] rgbtriple; 
 
	   rgbquad=NULL; 
	   rgbtriple=NULL; 
	   rgbwide /= 3; 
	   fclose(fp); 
     
//		m_pData =image;	 
		m_imagewidth = (unsigned int)rgbwide; 
		m_imageheight = (unsigned int)rgbhigh; 
		m_bitcount=nBitCount; 
		 int jj1; 
		 int Column,Row,totalgrid,num; 
//		 double imageX0,imageY0,imageX1,imageY1; 
		 int dm; 
		 dm=m_outdexdm; 
		 Column=INT(m_imagewidth/dm)+1; 
		 Row=INT(m_imageheight/dm)+1; 
		 totalgrid=Row*Column;//总的分块数 
			 
		if(m_bitcount==8) 
		{ 
			num=dm*dm;         
		} 
		else if(m_bitcount==24) 
		{ 
			num=dm*dm*3;         
		} 
		BYTE *temp=new BYTE[num]; 
		 
		double resolvx,resolvy,east, west, north, south; 
 
		if(!ReadDOMFile(m_CurFileName, resolvx, resolvy,  //读控制点文件 
							 east, west, north, south)) 
			 
							 return FALSE;	 
			//大地坐标系到分块坐标系的转换 
			//范围为左上点(north,west)右下点(south,east) 
			//转换成左下点(south,west)右上点(north,east) 
			 
			imageX0=south;//该坐标系为x向上,y向右 
			imageY0=west; 
			imageX1=north; 
			imageY1=east;    
			/////////////	 
			CString strIMG = m_CurFileName.Left(m_CurFileName.GetLength()-3)+"img"; 
			fp=fopen(strIMG,"wb"); 
			fwrite(&imageX0,sizeof(double),1,fp); 
			fwrite(&imageY0,sizeof(double),1,fp); 
			fwrite(&imageX1,sizeof(double),1,fp); 
			fwrite(&imageY1,sizeof(double),1,fp); 
			fwrite(&resolvx,sizeof(double),1,fp); 
			fwrite(&resolvy,sizeof(double),1,fp); 
			fwrite(&dm,sizeof(int),1,fp); 
			fwrite(&Row,sizeof(int),1,fp); 
			fwrite(&Column,sizeof(int),1,fp);        
			fwrite(&m_imagewidth,sizeof(int),1,fp); 
			fwrite(&m_imageheight,sizeof(int),1,fp); 
			fwrite(&m_bitcount,sizeof(int),1,fp); 
			 
			//写图象数据,最前面的数据是最左下角的	 
			int mi,mj,si,sj,k; 
			mi=0,mj=0; 
			si=dm,sj=dm;//si 表示每column块的扫描行数,sj每一块的扫描列数	 
			if(m_bitcount==8) 
			{ 
				for(mi=0;mi=m_imageheight||j>=m_imagewidth) 
					do{  
						temp[k]=0; 
						k++; 
					}while(k>dm*dm); 
					else 
					   { 
						   jj1=i*RowByteNum+j; 
						   temp[k]=image[jj1]; 
						   k++; 
					   } 
				} 
				fwrite(temp,k,1,fp); 
				 
				} 
			} 
			else if(m_bitcount==24) 
			{ 
				for(mi=0;mi=m_imageheight||j>=m_imagewidth) 
					do{  
						temp[k]=0; 
						temp[k+1]=0; 
						temp[k+2]=0; 
						k=k+3; 
						}while(k>dm*dm*3); 
					else 
					   { 
						   jj1=i*RowByteNum+j*3;//RowByteNum//imagewidth 
						   if(jj1>jj) 
							   continue; 
						   temp[k]=image[jj1]; 
						   temp[k+1]=image[jj1+1]; 
						   temp[k+2]=image[jj1+2]; 
						   k=k+3; 
					   } 
				} 
				fwrite(temp,k,1,fp); 
				 
				} 
			  
			} 
			image=NULL; 
			fclose(fp); 
 
			delete [] rgbquad; 
			delete [] rgbtriple; 
 			delete []image; 
			delete []temp; 
			return TRUE ; 
		} 
 
 
/////////////////////////////////////////////////////////////////////////////// 
//Function : write loction information of orthoimage to a dom file 
//参数: 
//	m_filename:文件名 
//	m_resolvx, m_resolvy :X、Y方向之影象分辨率 
//	m_I, m_J: 影象左上定位点的行列数 
//	m_Y, m_X: 影象左上定位点的坐标值 
/////////////////////////////////////////////////////////////////////////////// 
 
 
BOOL CImageDe::WriteDOMFile(CString& m_filename,double m_resolvx,double m_resolvy, 
				  double m_I,double m_J,double m_Y,double m_X) 
{ 
	CFile file1; 
	if(!file1.Open(m_filename,CFile::modeRead|CFile::shareDenyNone)) 
	{ 
		AfxMessageBox(_T("读正射影像失败!")); 
		return FALSE; 
	} 
	file1.Seek(sizeof(BITMAPFILEHEADER),CFile::begin); 
	BITMAPINFOHEADER bmihdr; 
	file1.Read(&bmihdr,sizeof(BITMAPINFOHEADER)); 
	file1.Close(); 
 
	CString strDOM = m_filename.Left(m_filename.GetLength()-4)+".dom"; 
 
	char fname[128]; 
	strcpy(fname,strDOM); 
	FILE* fp; 
	if((fp = fopen(fname,"w")) == NULL) 
	{ 
		AfxMessageBox(_T("写DOM文件失败!")); 
		return FALSE; 
	} 
	fprintf(fp,"DataMark: NSDTF_DOM\n"); 
	fprintf(fp,"Version: 1.0\n"); 
	fprintf(fp,"Unit: M\n"); 
	fprintf(fp,"Type: U\n"); 
	fprintf(fp,"SaveWay: U\n"); 
	fprintf(fp,"Band: 1\n"); 
	fprintf(fp,"Row: 0\n"); 
	fprintf(fp,"Col: 0\n"); 
	fprintf(fp,"Xr: %-lf\n",m_Y-m_I*m_resolvy); 
	fprintf(fp,"Yc: %-lf\n",m_X+m_J*m_resolvx); 
	fprintf(fp,"Dr: %-lf\n",m_resolvy); 
	fprintf(fp,"Dc: %-lf\n",m_resolvx); 
	fprintf(fp,"StoreLocation: %s\n",m_filename); 
	fprintf(fp,"West: %-lf\n",m_Y-m_I*m_resolvx); 
	fprintf(fp,"East: %-lf\n",m_Y-m_I*m_resolvx+m_resolvx*(bmihdr.biWidth-1)); 
	fprintf(fp,"South: %-lf\n",m_X+m_J*m_resolvy-m_resolvy*(bmihdr.biHeight-1)); 
	fprintf(fp,"North: %-lf\n",m_X+m_J*m_resolvy); 
	fprintf(fp,"Width: %d\n",bmihdr.biWidth); 
	fprintf(fp,"Height: %d\n",bmihdr.biHeight); 
	fclose(fp); 
 
	return TRUE; 
} 
/////////////////////////////////////////////////////////////////////////////// 
//Function : read loction information of orthoimage to variables 
//参数: 
//	strBMP:BMP文件名 
//	m_resolvx, m_resolvy :X、Y方向之影象分辨率 
//	east,west,north,south:正射影象大地坐标范围 
/////////////////////////////////////////////////////////////////////////////// 
 
 
BOOL CImageDe::ReadDOMFile(CString& strBMP,double& resolvx,double& resolvy, 
					double& east,double& west,double& north,double& south) 
{ 
	 
	 
	int width=m_imagewidth; 
	int height=m_imageheight; 
 
	CString strDOM = strBMP.Left(strBMP.GetLength()-3)+"dom"; 
 
	CStdioFile fileDOM; 
	if(!fileDOM.Open(strDOM,CFile::modeRead|CFile::shareDenyNone))  
	{ 
		AfxMessageBox(_T("读DOM文件失败!")); 
		return FALSE; 
	} 
	CString strTemp; 
	fileDOM.ReadString(strTemp); 
	if(strcmp(strTemp,"DataMark: NSDTF_DOM")!=0) 
	{ 
		AfxMessageBox(_T("DOM文件标志位错误!")); 
		return FALSE; 
	} 
 
	fileDOM.ReadString(strTemp); //Version: 1.0 
	fileDOM.ReadString(strTemp); //Unit: M 
	fileDOM.ReadString(strTemp); //Type 
	fileDOM.ReadString(strTemp); //SaveWay 
	fileDOM.ReadString(strTemp); //Band 
 
	fileDOM.ReadString(strTemp); 
	int nright = strTemp.GetLength() - strTemp.Find(":")-1; 
	int row = atoi(strTemp.Right(nright)); 
	fileDOM.ReadString(strTemp); 
		nright = strTemp.GetLength() - strTemp.Find(":")-1; 
	int col = atoi(strTemp.Right(nright)); 
 
	fileDOM.ReadString(strTemp); 
		nright = strTemp.GetLength() - strTemp.Find(":")-1; 
	double Xr = atof(strTemp.Right(nright)); 
 
	fileDOM.ReadString(strTemp); 
		nright = strTemp.GetLength() - strTemp.Find(":")-1; 
	double Yc = atof(strTemp.Right(nright)); 
 
	fileDOM.ReadString(strTemp); 
		nright = strTemp.GetLength() - strTemp.Find(":")-1; 
	resolvy = atof(strTemp.Right(nright)); 
 
	fileDOM.ReadString(strTemp); 
		nright = strTemp.GetLength() - strTemp.Find(":")-1; 
	resolvx = atof(strTemp.Right(nright)); 
 
	west = Xr; 
	north = Yc; 
	east = west+resolvx*(width-1); 
	south = north-resolvy*(height-1); 
 
	return TRUE; 
} 
/////////////////////////////////////////////////////////////////////////////// 
//Function :以bmp输出当前显示的影象,保留定位信息 
//参数: 
//	m_BoxImage 为d当前图象的指针数组 
 
/////////////////////////////////////////////////////////////////////////////// 
 
 
BOOL CImageDe::PutImageInBmp()  
 
 { 
		CFinDlg dlg2; 
		CString DesImageFileName,DesDOMFileName;  
		DesImageFileName = _T("c:\\temp\\temp.bmp"); 
		dlg2.m_szFileName = DesImageFileName; 
		if(dlg2.DoModal() == IDCANCEL) return FALSE; 
		if(dlg2.m_szFileName.Right(4)!=_T(".bmp") && dlg2.m_szFileName.Right(4)!=_T(".BMP")) 
		DesImageFileName=dlg2.m_szFileName+_T(".bmp"); 
		 
		DesImageFileName=dlg2.m_szFileName; 
		DesDOMFileName=DesImageFileName; 
		 
		CFile file; 
		if(!file.Open(DesImageFileName,CFile::modeCreate|CFile::modeReadWrite)) 
		{ 
			AfxMessageBox(_T("目标文件打开失败!")); 
			return FALSE; 
		} 
    	 
	     if(mBoxImage==NULL)     
		{ 
			 return FALSE; 
			 
    
		} 
    BITMAPFILEHEADER bmfhr; 
	BITMAPINFOHEADER bmihr; 
 
	bmfhr.bfType =(WORD)(('M'<<8)|'B'); 
	bmfhr.bfReserved1 =(WORD)0;  
	bmfhr.bfReserved2 =(WORD)0;  
	bmfhr.bfOffBits =(DWORD)sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);  
	if(m_bitcount==8) bmfhr.bfOffBits+=sizeof(RGBQUAD)*256; 
	bmfhr.bfSize =(DWORD)sizeof(BITMAPINFOHEADER); 
 
	bmihr.biSize =(DWORD)sizeof(BITMAPINFOHEADER);  
	bmihr.biWidth =(long)datawidth;  
	bmihr.biHeight =(long)dataheight;  
	bmihr.biPlanes =(WORD)1;  
	bmihr.biBitCount =(WORD)m_bitcount;  
	bmihr.biCompression =(DWORD)BI_RGB;  
	bmihr.biSizeImage =0;  
	bmihr.biXPelsPerMeter =(long)0;  
	bmihr.biYPelsPerMeter =(long)0;  
	bmihr.biClrUsed =(DWORD)0;  
	bmihr.biClrImportant =(DWORD)0;  
 
	file.Write(&bmfhr,sizeof(BITMAPFILEHEADER)); 
	file.Write(&bmihr,sizeof(BITMAPINFOHEADER)); 
 
	if(m_bitcount==8)  
	{ 
		RGBQUAD rgbpal[256]; 
		for(int i=0;i<256;i++) 
		{ 
			rgbpal[i].rgbRed  = m_rgbquad[i].rgbRed; 
			rgbpal[i].rgbGreen= m_rgbquad[i].rgbGreen; 
			rgbpal[i].rgbBlue = m_rgbquad[i].rgbBlue; 
			rgbpal[i].rgbReserved=0; 
		} 
		file.Write(rgbpal,sizeof(RGBQUAD)*256L); 
	} 
 
       int rest,RowByteNum; 
	    rest=int(fmod(datawidth*m_bitcount,32)); 
		if(rest!=0) 
		 RowByteNum=((datawidth*m_bitcount)+31)/32*4;     
		//RowByteNum=(Width*nBitCount)/8+4;    	 
	 
		else 
		RowByteNum=(datawidth*m_bitcount)/8;    	 
 
	int jj= dataheight*RowByteNum; 
		 
	CWaitCursor wait; 
 
	if(m_bitcount==8) 
	{ 
			file.Write(mBoxImage, jj); 
	} 
	else if(m_bitcount==24) 
	{ 
		file.Write(mBoxImage, jj); 
		 
	} 
	 
	file.Close(); 
	double resolvx,resolvy,east, west, north, south; 
	if(!ReadDOMFile(m_CurFileName, resolvx, resolvy,  //读控制点文件 
						 east, west, north, south)) 
	{ 
		AfxMessageBox("读DOM文件失败,无法保存影象的定位信息"); 
		return FALSE; 
	} 
	double BoxPointy=west/*Xr原点*/+m_BoxI*resolvy;//m_resolvy;//作为新图象的原点坐标 
	double BoxPointx=north/*Yc*/-m_BoxJ*resolvx;//m_resolvx;    
      
	WriteDOMFile(DesDOMFileName, resolvx, resolvy, 
				  0,0,BoxPointy, BoxPointx);//BoxPointy指距North(X)的距离 
	return TRUE;    
      
 } 
 
//该函数和PutImageInBmp功能一样 
//只是增加了文件名做参数 
//由于显示数据为24位,这里只保存24位bmp 
 
BOOL CImageDe::OutPutImageInBmp(CString filename) 
{ 
		 
		CString DesImageFileName,DesDOMFileName;  
 
	    filename = filename.Left(filename.GetLength()-4)+".bmp"; 
			 
		DesImageFileName=filename; 
		DesDOMFileName=DesImageFileName; 
		 
		CFile file; 
		if(!file.Open(DesImageFileName,CFile::modeCreate|CFile::modeReadWrite)) 
		{ 
			AfxMessageBox(_T("目标文件打开失败!")); 
			return FALSE; 
		} 
    	 
	     if(mBoxImage==NULL)     
		{ 
			 return FALSE;			 
    
		} 
    BITMAPFILEHEADER bmfhr; 
	BITMAPINFOHEADER bmihr; 
 
	bmfhr.bfType =(WORD)(('M'<<8)|'B'); 
	bmfhr.bfReserved1 =(WORD)0;  
	bmfhr.bfReserved2 =(WORD)0;  
	bmfhr.bfOffBits =(DWORD)sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);  
	//if(m_bitcount==8) bmfhr.bfOffBits+=sizeof(RGBQUAD)*256; 
	bmfhr.bfSize =(DWORD)sizeof(BITMAPINFOHEADER); 
 
	bmihr.biSize =(DWORD)sizeof(BITMAPINFOHEADER);  
	bmihr.biWidth =(long)datawidth;  
	bmihr.biHeight =(long)dataheight;  
	bmihr.biPlanes =(WORD)1;  
	bmihr.biBitCount =(WORD)24;//m_bitcount;  
	bmihr.biCompression =(DWORD)BI_RGB;  
	bmihr.biSizeImage =0;  
	bmihr.biXPelsPerMeter =(long)0;  
	bmihr.biYPelsPerMeter =(long)0;  
	bmihr.biClrUsed =(DWORD)0;  
	bmihr.biClrImportant =(DWORD)0;  
 
	file.Write(&bmfhr,sizeof(BITMAPFILEHEADER)); 
	file.Write(&bmihr,sizeof(BITMAPINFOHEADER)); 
    /* 
	if(m_bitcount==8)  
	{ 
		RGBQUAD rgbpal[256]; 
		for(int i=0;i<256;i++) 
		{ 
			rgbpal[i].rgbRed  = m_rgbquad[i].rgbRed; 
			rgbpal[i].rgbGreen= m_rgbquad[i].rgbGreen; 
			rgbpal[i].rgbBlue = m_rgbquad[i].rgbBlue; 
			rgbpal[i].rgbReserved=0; 
		} 
		file.Write(rgbpal,sizeof(RGBQUAD)*256L); 
	} 
	*/ 
 
	/* 
    int rest,RowByteNum; 
	rest=int(fmod(datawidth*m_bitcount,32)); 
	if(rest!=0) 
	 RowByteNum=((datawidth*m_bitcount)+31)/32*4;     
	//RowByteNum=(Width*nBitCount)/8+4;    		 
	else 
	RowByteNum=(datawidth*m_bitcount)/8;    
	int jj= dataheight*RowByteNum;			 
	CWaitCursor wait; 
	if(m_bitcount==8) 
		{ 
			file.Write(mBoxImage, jj); 
		} 
		else if(m_bitcount==24) 
		{ 
			file.Write(mBoxImage, jj);			 
		}	 
		file.Close(); 
	*/ 
	 int RowByteNum; 
	 RowByteNum=((datawidth*24)+31)/32*4;     
	 int jj= dataheight*RowByteNum;			 
	 CWaitCursor wait; 
	 file.Write(mBoxImage, jj);			 
	 file.Close(); 
  	double resolvx,resolvy,east, west, north, south; 
	if(!ReadDOMFile(m_CurFileName, resolvx, resolvy,  //读控制点文件 
						 east, west, north, south)) 
	{ 
		AfxMessageBox("读DOM文件失败,无法保存影象的定位信息"); 
		return FALSE; 
	} 
	double BoxPointy=west/*Xr原点*/+m_BoxI*resolvy;//m_resolvy;//作为新图象的原点坐标 
	double BoxPointx=north/*Yc*/-m_BoxJ*resolvx;//m_resolvx;    
      
	WriteDOMFile(DesDOMFileName, resolvx, resolvy, 
				  0,0,BoxPointy, BoxPointx);//BoxPointy指距North(X)的距离 
   	return TRUE;    
 
} 
 
//对大幅影象生成索引文件 
 
  BOOL CImageDe::OutPutDex(CString m_CurFileName) 
{ 
	if(NULL != m_pData) 
	{ 
		delete [] m_pData; 
		m_pData = NULL; 
	} 
	 
   ////////////  调色板 
	CString Filename; 
	RGBQUAD rgbpal[256]; 
	FILE* fpbmp; 
	 
	//CFile file256; 
	BITMAPFILEHEADER *bmfhr;  //memory dump 
    BITMAPINFOHEADER *bmihr; 
    bmfhr=new BITMAPFILEHEADER; 
    bmihr=new BITMAPINFOHEADER; 
 
	fpbmp=fopen(m_CurFileName,"rb"); 
	fread(bmfhr,sizeof(BITMAPFILEHEADER),1,fpbmp); 
	fread(bmihr,sizeof(BITMAPINFOHEADER),1,fpbmp); 
	if(bmihr->biBitCount ==8) 
    for(int i=0;i<256;i++) 
	  {   
		  fread(&rgbpal[i].rgbBlue,1,1,fpbmp); 
		  fread(&rgbpal[i].rgbGreen,1,1,fpbmp); 
		  fread(&rgbpal[i].rgbRed,1,1,fpbmp); 
		  fread(&rgbpal[i].rgbReserved,1,1,fpbmp); 
	   }        
	fclose(fpbmp); 
	HDIB hDIB; 
	hFile1 = CreateFile(m_CurFileName,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE, 
						(LPSECURITY_ATTRIBUTES)NULL,OPEN_EXISTING, 
						FILE_FLAG_RANDOM_ACCESS,(HANDLE)NULL); 
   
	if (hFile1 == INVALID_HANDLE_VALUE)      
    { 
        ASSERT(FALSE); 
		DWORD ss=GetLastError(); 
        return FALSE;        
    } 
 
	hFile = CreateFileMapping( hFile1,NULL,PAGE_READONLY,0,0,NULL); 
	pMapFile1 = (LPSTR)MapViewOfFile(hFile,FILE_MAP_READ,0,0,0); 
   if(pMapFile1 == NULL) return  FALSE; 
 
	LPSTR pFile = (LPSTR)pMapFile1; 
	pFile += sizeof(BITMAPFILEHEADER);	 
	hDIB = (HDIB)pFile; 
 
    LPBITMAPINFOHEADER lpbmi1 = LPBITMAPINFOHEADER(hDIB); 
 
	m_bitcount=(lpbmi1->biBitCount==8)? 8:24; 
	m_imagewidth=lpbmi1->biWidth; 
	m_imageheight=lpbmi1->biHeight; 
 
    int rest,RowByteNum; 
	rest=int(fmod(m_imagewidth*m_bitcount,32)); 
	if(rest!=0) 
	RowByteNum=((m_imagewidth*m_bitcount)+31)/32*4;     
	else 
	RowByteNum=(m_imagewidth*m_bitcount)/8;    	 
	long jj= (long)m_imageheight*(long)RowByteNum;	 
  	LPBYTE lpbitRead=(LPBYTE)lpbmi1+sizeof(BITMAPINFOHEADER); 
	if(m_bitcount == 8) lpbitRead+=sizeof(RGBQUAD)*256; 
 
    CWaitCursor wait; 
  
    int jj1,Column,Row,totalgrid,num; 
//    double imageX0,imageY0,imageX1,imageY1; 
    int dm; 
	dm=m_outdexdm; 
  	Column=INT(m_imagewidth/dm)+1; 
  	Row=INT(m_imageheight/dm)+1; 
	totalgrid=Row*Column;//总的分块数 
		 
		if(m_bitcount==8) 
		{ 
			num=dm*dm;         
		} 
		else if(m_bitcount==24) 
		{ 
			num=dm*dm*3;         
		} 
		BYTE *temp=new BYTE[num]; 
		 
		double resolvx,resolvy,east, west, north, south; 
 
		if(!ReadDOMFile(m_CurFileName, resolvx, resolvy,  //读控制点文件 
							 east, west, north, south)) 
			 
							 return FALSE;	 
			 
			imageX0=south; 
			imageY0=west; 
			imageX1=north; 
			imageY1=east;    
			//////////////////////////////////// 
			CString strIMG = m_CurFileName.Left(m_CurFileName.GetLength()-3)+"img"; 
			FILE *fp=fopen(strIMG,"wb"); 
			fwrite(&imageX0,sizeof(double),1,fp); 
			fwrite(&imageY0,sizeof(double),1,fp); 
			fwrite(&imageX1,sizeof(double),1,fp); 
			fwrite(&imageY1,sizeof(double),1,fp); 
			fwrite(&resolvx,sizeof(double),1,fp); 
			fwrite(&resolvy,sizeof(double),1,fp); 
			fwrite(&dm,sizeof(int),1,fp); 
			fwrite(&Row,sizeof(int),1,fp); 
			fwrite(&Column,sizeof(int),1,fp);        
			fwrite(&m_imagewidth,sizeof(int),1,fp); 
			fwrite(&m_imageheight,sizeof(int),1,fp); 
			fwrite(&m_bitcount,sizeof(int),1,fp); 
			////////////  调色板/////////////// 
			if(m_bitcount==8) 
			for(int i=0;i<256;i++) 
			  {   
				  fwrite(&rgbpal[i].rgbBlue,1,1,fp); 
				  fwrite(&rgbpal[i].rgbGreen,1,1,fp); 
				  fwrite(&rgbpal[i].rgbRed,1,1,fp); 
				  fwrite(&rgbpal[i].rgbReserved,1,1,fp); 
				}   
						 
			//写图象数据,最前面的数据是最左下角的	 
			int i,j; 
			int mi,mj,si,sj,k; 
			mi=0,mj=0; 
			si=dm,sj=dm;//si 表示每column块的扫描行数,sj每一块的扫描列数	 
			if(m_bitcount==8) 
			{ 
				for(mi=0;mi=m_imageheight||j>=m_imagewidth) 
					do{  
						temp[k]=0; 
						k++; 
					}while(k>dm*dm); 
					else 
					   { 
						   jj1=i*RowByteNum+j; 
						    if(jj1>jj)continue;//?原因待查 
						   temp[k]=lpbitRead[jj1]; 
						   k++; 
					   } 
				} 
				fwrite(temp,k,1,fp); 
				 
				} 
			} 
			else if(m_bitcount==24) 
			{ 
				for(mi=0;mi=m_imageheight||j>=m_imagewidth) 
					do{  
						temp[k]=0; 
						temp[k+1]=0; 
						temp[k+2]=0; 
						k=k+3; 
						}while(k>dm*dm*3); 
					else 
					   { 
						   jj1=i*RowByteNum+j*3;//RowByteNum//imagewidth 
						   if(jj1>jj)continue; 
						   temp[k]=lpbitRead[jj1]; 
						   temp[k+1]=lpbitRead[jj1+1]; 
						   temp[k+2]=lpbitRead[jj1+2]; 
						   k=k+3; 
					   } 
				} 
				fwrite(temp,k,1,fp); 
			//	temp=NULL; 
				 
				} 
			  
			} 
			 
			delete []temp; 
		 
	        return TRUE ; 
	 
} 
 
 
BOOL CImageDe::GetImageInfo()  
  
 { 
     	    FILE *fp;			 
			CString strIMG = m_CurFileName.Left(m_CurFileName.GetLength()-3)+"img";			 
			 if((fp = fopen(strIMG ,"rb")) == NULL) 
			{ 
				AfxMessageBox("没有找到索引文件!"); 
				return FALSE; 
			} 			 
			int   dm,Row,Column; 
			double resolvx,resolvy,north, west; 
			fread(&IsDomTrue,sizeof(int),1,fp); 
			fread(&west,sizeof(double),1,fp); 
			fread(&north,sizeof(double),1,fp); 
			fread(&resolvx,sizeof(double),1,fp); 
			fread(&resolvy,sizeof(double),1,fp); 
 
			fread(&dm,sizeof(int),1,fp); 
			fread(&Row,sizeof(int),1,fp); 
			fread(&Column,sizeof(int),1,fp); 
			fread(&m_imagewidth,sizeof(int),1,fp); 
			fread(&m_imageheight,sizeof(int),1,fp); 
			fread(&m_bitcount,sizeof(int),1,fp); 
			if(m_rgbquad != NULL)   
			{ 
				delete []m_rgbquad;			 
				m_rgbquad=NULL;		 
			} 
			RGBQUAD *rgbpal; 
			rgbpal=new RGBQUAD[256];   	 
			if(m_bitcount==8)    //memory dump 
			for(int i=0;i<256;i++) 
			{   
			  fread(&rgbpal[i].rgbBlue,1,1,fp); 
			  fread(&rgbpal[i].rgbGreen,1,1,fp); 
			  fread(&rgbpal[i].rgbRed,1,1,fp); 
			  fread(&rgbpal[i].rgbReserved,1,1,fp); 
			}        
			m_rgbquad=rgbpal;  //m_rgbquad在析构函数里删除 
			m_resolvx=resolvx; 
			m_resolvy=resolvy; 
			m_dm=dm; 
			m_Row=Row; 
			m_Column=Column; 
			m_TotalWidth=m_Column*m_dm; 
	        m_TotalHeight=m_Row*m_dm;	 
            m_OriginX=west;//指原始图象左下角点大地坐标  
			m_OriginY=north-m_imageheight*resolvy; 
			fclose(fp); 
			return TRUE;		 
} 
 
/// 
 
//********转换256成24位 
 
 BOOL CImageDe::Change256To24(CString SourseImageFileName) 
 
 {		 
	   CString DesImageFileName; 
	   //DesImageFileName = _T("c:\\temp\\temp.bmp"); 
	    DesImageFileName = SourseImageFileName.Left(SourseImageFileName.GetLength()-4)+"n24.bmp";		 
		CFile file256; 
		CFile file; 
		if(!file256.Open(SourseImageFileName,CFile::modeRead)) 
		{ 
			AfxMessageBox(_T("文件打开失败!")); 
			return FALSE; 
		}      
	 BITMAPFILEHEADER *bmfhr; 
	 BITMAPINFOHEADER *bmihr; 
	 bmfhr=new BITMAPFILEHEADER; 
	 bmihr=new BITMAPINFOHEADER; 
          
	file256.Read(bmfhr,sizeof(BITMAPFILEHEADER)); 
	file256.Read(bmihr,sizeof(BITMAPINFOHEADER)); 
 
    if(bmihr->biBitCount !=8)return FALSE; 
	RGBQUAD rgbpal[256]; 
	file256.Read(rgbpal,sizeof(RGBQUAD)*256L); 
	int width=bmihr->biWidth; 
	int height=bmihr->biHeight; 
    unsigned char *bmpimage = NULL;     //store the bytes of the image 
	unsigned char *tempimage = NULL;     //store the bytes of the image 
	int rest8,rest24; 
	long RowByteNum,RowByteNum24; 
    rest8=int(fmod(width*8,32)); 
	rest24=int(fmod(width*24,32)); 
	if(rest8!=0) RowByteNum=((width*8)+31)/32*4;     
	else 	 
		RowByteNum=(width*8)/8;  
	if(rest24!=0) RowByteNum24=((width*24)+31)/32*4;     
	  else 	 
		RowByteNum24=(width*24)/8;  
	long jj= (long)height*(long)RowByteNum; 
	long jj24= (long)height*(long)RowByteNum24; 
   	bmpimage=new unsigned char[jj]; 
	tempimage=new unsigned char[jj24]; 
	file256.Read(bmpimage, jj); 
	file256.Close(); 
	 
	//********处理 
    bmihr->biBitCount =24; //转换成24位的位图 
    int mi,mj,k,jj1; 
	k=0; 
	 
	for(mi=0;mibfOffBits =(DWORD)sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);  
	bmfhr->bfType =(WORD)(('M'<<8)|'B'); 
	bmfhr->bfReserved1 =(WORD)0;  
	bmfhr->bfReserved2 =(WORD)0; 	 
	bmfhr->bfSize =(DWORD)(sizeof(BITMAPINFOHEADER)+sizeof(BITMAPFILEHEADER)+jj24); 
	 
	bmihr->biSize =(DWORD)sizeof(BITMAPINFOHEADER);  
	bmihr->biWidth =(long)width;  
	bmihr->biHeight =(long)height;  
	bmihr->biPlanes =(WORD)1;  
	bmihr->biBitCount =(WORD)24;  
	 
	bmihr->biCompression =(DWORD)BI_RGB;  
	bmihr->biSizeImage =0;  
	bmihr->biXPelsPerMeter =(long)0;  
	bmihr->biYPelsPerMeter =(long)0;  
	bmihr->biClrUsed =(DWORD)0;  
	bmihr->biClrImportant =(DWORD)0; 	 
 
	file.Write(bmfhr,sizeof(BITMAPFILEHEADER)); 
	file.Write(bmihr,sizeof(BITMAPINFOHEADER)); 
	file.Write(tempimage,jj24); 
	file.Close(); 
   	return TRUE;    
 
 } 
//生成索引和重采样略图 
//不包含定位信息,以分块图象的左上角为原点 
 
 BOOL CImageDe::OutPutIMG(CString m_CurFileName) 
{ 
	if(NULL !=mBoxImage ) 
	{ 
		delete [] mBoxImage; 
		mBoxImage = NULL; 
	} 
	////////////  调色板 
	CString Filename; 
	RGBQUAD rgbpal[256]; 
	FILE* fpbmp; 
	BITMAPFILEHEADER *bmfhr;  //memory dump 
    BITMAPINFOHEADER *bmihr; 
    bmfhr=new BITMAPFILEHEADER; 
    bmihr=new BITMAPINFOHEADER; 
	CString BMPSource = m_CurFileName.Left(m_CurFileName.GetLength()-4)+".bmp"; 
 
	fpbmp=fopen(BMPSource,"rb"); 
 
	fread(bmfhr,sizeof(BITMAPFILEHEADER),1,fpbmp); 
	fread(bmihr,sizeof(BITMAPINFOHEADER),1,fpbmp); 
	if(bmihr->biBitCount!=8&&bmihr->biBitCount!=24) 
	 { 
		AfxMessageBox("本程序不能处理该格式图象,请先转成8位或24位BMP!"); 
		return FALSE; 
	} 
	if(bmihr->biBitCount ==8) 
    for(int i=0;i<256;i++) 
	  {   
		  fread(&rgbpal[i].rgbBlue,1,1,fpbmp); 
		  fread(&rgbpal[i].rgbGreen,1,1,fpbmp); 
		  fread(&rgbpal[i].rgbRed,1,1,fpbmp); 
		  fread(&rgbpal[i].rgbReserved,1,1,fpbmp); 
	   }        
	fclose(fpbmp); 
	////////////得到影象定位信息 
	//	double m_OriginX,m_OriginY; 
	//double m_resolvy,m_resolvx; 
 
	double resolvx,resolvy,east, west, north, south; 
	if(!ReadDOMFile(m_CurFileName, resolvx, resolvy,  //读控制点文件 
						 east, west, north, south)) 
	{ 
	 IsDomTrue=0; 
	 west=north=resolvx=resolvy=-99999;		 
	} 
	else 
	{ 
		IsDomTrue=1; 
		 
	} 
 
	/////////// 
 
	HDIB hDIB; 
	hFile1 = CreateFile(m_CurFileName,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE, 
						(LPSECURITY_ATTRIBUTES)NULL,OPEN_EXISTING, 
						FILE_FLAG_RANDOM_ACCESS,(HANDLE)NULL); 
   
	if (hFile1 == INVALID_HANDLE_VALUE)      
    { 
        ASSERT(FALSE); 
		DWORD ss=GetLastError(); 
        return FALSE;        
    } 
 
	hFile = CreateFileMapping( hFile1,NULL,PAGE_READONLY,0,0,NULL); 
	pMapFile1 = (LPSTR)MapViewOfFile(hFile,FILE_MAP_READ,0,0,0); 
    if(pMapFile1 == NULL) return  FALSE; 
 
	LPSTR pFile = (LPSTR)pMapFile1; 
	pFile += sizeof(BITMAPFILEHEADER);	 
	hDIB = (HDIB)pFile; 
 
    LPBITMAPINFOHEADER lpbmi1 = LPBITMAPINFOHEADER(hDIB); 
	 
	m_bitcount=(lpbmi1->biBitCount==8)? 8:24; 
	m_imagewidth=lpbmi1->biWidth; 
	m_imageheight=lpbmi1->biHeight; 
 
    int rest,RowByteNum; 
	rest=int(fmod(m_imagewidth*m_bitcount,32)); 
	if(rest!=0) 
	RowByteNum=((m_imagewidth*m_bitcount)+31)/32*4;     
	else 
	RowByteNum=(m_imagewidth*m_bitcount)/8;    	 
	long jj= (long)m_imageheight*(long)RowByteNum;	 
  	LPBYTE lpbitRead=(LPBYTE)lpbmi1+sizeof(BITMAPINFOHEADER); 
	if(m_bitcount == 8) lpbitRead+=sizeof(RGBQUAD)*256; 
    CWaitCursor wait;  
    int jj1,Column,Row,totalgrid,num; 
	int dm;   
	dm=m_outdexdm; 
     
  	Column=INT(m_imagewidth/dm)+1; 
  	Row=INT(m_imageheight/dm)+1; 
	totalgrid=Row*Column;//总的分块数 
		 
		if(m_bitcount==8) 
		{ 
			num=dm*dm;         
		} 
		else if(m_bitcount==24) 
		{ 
			num=dm*dm*3;         
		} 
		BYTE *temp=new BYTE[num]; 
		 
		CString strIMG = m_CurFileName.Left(m_CurFileName.GetLength()-3)+"img"; 
		FILE *fp=fopen(strIMG,"wb");		 
	    fwrite(&IsDomTrue,sizeof(int),1,fp); 
		fwrite(&west,sizeof(double),1,fp); 
		fwrite(&north,sizeof(double),1,fp); 
		fwrite(&resolvx,sizeof(double),1,fp); 
		fwrite(&resolvy,sizeof(double),1,fp); 
		fwrite(&dm,sizeof(int),1,fp); 
		fwrite(&Row,sizeof(int),1,fp); 
		fwrite(&Column,sizeof(int),1,fp);        
		fwrite(&m_imagewidth,sizeof(int),1,fp); 
		fwrite(&m_imageheight,sizeof(int),1,fp); 
		fwrite(&m_bitcount,sizeof(int),1,fp); 
 
		////////////  调色板/////////////// 
		if(m_bitcount==8) 
		for(int i=0;i<256;i++) 
		{   
			  fwrite(&rgbpal[i].rgbBlue,1,1,fp); 
			  fwrite(&rgbpal[i].rgbGreen,1,1,fp); 
			  fwrite(&rgbpal[i].rgbRed,1,1,fp); 
			  fwrite(&rgbpal[i].rgbReserved,1,1,fp); 
		}   
		//写图象数据,最前面的数据是最左下角的	 
		int i,j; 
		int mi,mj,si,sj,k; 
		mi=0,mj=0; 
		si=dm,sj=dm;//si 表示每column块的扫描行数,sj每一块的扫描列数	 
		if(m_bitcount==8) 
		{ 
			for(mi=0;mi=m_imageheight||j>=m_imagewidth) 
				do{  
					temp[k]=0; 
					k++; 
				}while(k>dm*dm); 
    			else 
			   { 
				   jj1=i*RowByteNum+j; 
					if(jj1>jj)continue;//?原因待查 
				   temp[k]=lpbitRead[jj1]; 
				   k++; 
			   } 
			} 
			fwrite(temp,k,1,fp); 
			 
			} 
		} 
		else if(m_bitcount==24) 
		{ 
			for(mi=0;mi=m_imageheight||j>=m_imagewidth) 
				do{  
					temp[k]=0; 
					temp[k+1]=0; 
					temp[k+2]=0; 
					k=k+3; 
					}while(k>dm*dm*3); 
				else 
				   { 
					   jj1=i*RowByteNum+j*3;//RowByteNum//imagewidth 
					   if(jj1>jj)continue; 
					   temp[k]=lpbitRead[jj1]; 
					   temp[k+1]=lpbitRead[jj1+1]; 
					   temp[k+2]=lpbitRead[jj1+2]; 
					   k=k+3; 
				   } 
			} 
			fwrite(temp,k,1,fp); 
						 
			} 
		  
		} 
	delete []temp; 
	fclose(fp); 
 
	/* 
	/////////////////// 
	CString DesImageFileName; 
	DesImageFileName = m_CurFileName.Left(m_CurFileName.GetLength()-4)+"all.bmp";		 
  	CFile file; 
	BYTE  *tempimage = NULL;    	 
	int nbl1,nbl2; 
    nbl1=(int)m_imagewidth/SCREENW+1;	//若等于1,则采样后的图象不变 
    nbl2=(int)m_imageheight/SCREENH+1; 
    if(nbl1>nbl2)  
		nbl2=nbl1; 
	else 
		nbl1=nbl2;	 
	n_Allwidth= (int)(m_imagewidth/nbl1);//+1 加1有可能大于实际图象数据 
	n_Allheight=(int)(m_imageheight/nbl2);//+1 
    long RowByteNum24; 
	RowByteNum24=((n_Allwidth*24)+31)/32*4;     
	long jj24= n_Allheight*RowByteNum24;		 
	tempimage=new  BYTE[jj24]; 
	 
	int jj2=0; 
	int ni,nj; 
	k=0; 
	if(m_bitcount==8)	 
	for(mi=0,ni=0;nibfOffBits =(DWORD)sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);  
	bmfhr->bfType =(WORD)(('M'<<8)|'B'); 
	bmfhr->bfReserved1 =(WORD)0;  
	bmfhr->bfReserved2 =(WORD)0; 	 
	bmfhr->bfSize =(DWORD)(sizeof(BITMAPINFOHEADER)+sizeof(BITMAPFILEHEADER)+jj24); 
	 
	bmihr->biSize =(DWORD)sizeof(BITMAPINFOHEADER);  
	bmihr->biWidth =(long)n_Allwidth;// SCREENW;// 
	bmihr->biHeight =(long)n_Allheight;//(long)height;  
	bmihr->biPlanes =(WORD)1;  
	bmihr->biBitCount =(WORD)24;  
	 
	bmihr->biCompression =(DWORD)BI_RGB;  
	bmihr->biSizeImage =0;  
	bmihr->biXPelsPerMeter =(long)0;  
	bmihr->biYPelsPerMeter =(long)0;  
	bmihr->biClrUsed =(DWORD)0;  
	bmihr->biClrImportant =(DWORD)0; 	 
 
	file.Write(bmfhr,sizeof(BITMAPFILEHEADER)); 
	file.Write(bmihr,sizeof(BITMAPINFOHEADER)); 
	file.Write(tempimage,jj24);// 
	file.Close(); 
	*/ 
	/* 
	if(fmod(n_Allwidth,4)!=0) 
	newdatawidth=n_Allwidth+4-n_Allwidth%4; 
	else newdatawidth=n_Allwidth; 
	nlack=newdatawidth-n_Allwidth;//若不是被四整除,数据添零 
    */ 
	return TRUE ; 
 
} 
 
/////////////////////////////////////////////////////////////////////////////// 
//Function :从图象索引中得到所选box范围的图象数据,只对8位、24位有效 
//参数: 
//	point1,point2为鼠标取的点 
//	m_BoxImage 为新图象的指针数组 
 
/////////////////////////////////////////////////////////////////////////////// 
 
 
BOOL CImageDe::GetImageFromBox(CRect rect,int pscreenX0,int pscreenY0)  
  
 { 
	FILE *fp;		 
	CString strIMG = m_CurFileName.Left(m_CurFileName.GetLength()-3)+"img";			 
	 if((fp = fopen(strIMG ,"rb")) == NULL) 
	{ 
		AfxMessageBox("Cannot open the image file!"); 
		return FALSE; 
	} 
	int  dm,Row,Column;	 	  
	//int headoff=6*sizeof(int); 
	int headoff=7*sizeof(int)+4*sizeof(double); 
	if(m_bitcount==8) 
		headoff=headoff+256*sizeof(RGBQUAD); 
	fseek(fp,headoff,1); 
	int offset;//指针移动量 
	int nMaxRow,nMinRow,nMaxCol,nMinCol,totalgrid;                
    dm=m_dm;Row=m_Row;Column=m_Column; 
    nMinCol = INT(rect.left / dm); 
	nMinRow = INT((m_imageheight-rect.bottom) / dm); 
	nMaxCol = INT(rect.right / dm); 
	nMaxRow = INT((m_imageheight-rect.top) / dm);	 
	//m_BoxI,m_BoxJ 用来表示BOX图象最左上角的点在原始图象中的行列数 
	//注意它以最左上角像素为原点 
	m_BoxI=rect.top; 
	m_BoxJ=rect.left; 
 
	 
	if(nMinRow<0) nMinRow=0;  //Row 表示行,Col表示列 
	if(nMaxRow>Row) nMaxRow=Row; 
	if(nMinCol<0) nMinCol=0; 
	if(nMaxCol>Column) nMaxCol=Column; 
 
	int nBeginGridIndex = nMinRow * Column + nMinCol;       //from zero? 
	int num=(nMaxCol-nMinCol+1)*(nMaxRow-nMinRow+1)*dm*dm;  //all grid pixes in box 
	int nEndGridIndex = nMaxRow *  Column + nMaxCol; 
	totalgrid=Row*Column; 
		 
	//head=4*sizeof(double)+ (3 + totalgrid)*sizeof(int); 
	 
	//add for 24 draw 
	 
    if(m_bitcount==8) offset=dm*dm;   
    else if(m_bitcount==24) offset=dm*dm*3;  
    else return FALSE; 
    num=num*3; 
	/* 
	if(m_bitcount==8) offset=dm*dm;   
	else if(m_bitcount==24) 
	{ 
		offset=dm*dm*3;  
		num=num*3; 
	} 
	*/ 
	if(mBoxImage != NULL)   
	{ 
		delete []mBoxImage;			 
		mBoxImage=NULL;		 
	} 
	mBoxImage = new BYTE[num]; 
	BYTE *temp = new BYTE[offset]; 
    	   	 
	fseek(fp,nBeginGridIndex * offset, 1); 
 
	int jj,ii;//表示已经迭加的块 
	int i; 
	int iRow,iCol; 
	int ki,kj; 
	if(m_bitcount==8)	 
		{ 
			for( i = nBeginGridIndex; i < nEndGridIndex + 1; i ++) 
			{ 
				if( i % Column >= nMinCol && i % Column <= nMaxCol ) 
				{ 
					fread(temp,offset,1,fp); 
					iRow=INT(i/Column); 
					iCol=i%Column; 
					  for(ki=0;ki= nMinCol && i % Column <= nMaxCol ) 
					{ 
						fread(temp,offset,1,fp); 
						iRow=INT(i/Column); 
						iCol=i%Column; 
						  for(ki=0;kim_imagewidth) 
	{ 
       datawidth=m_imagewidth; 
		MessageBeep(0); 
		AfxMessageBox("There some problem in the Box Selecting"); 
		return FALSE; 
	} 
	*/	 
	 
	/* 
	if(dataheight>m_imageheight) 
	   dataheight=m_imageheight; 
   */ 
	delete []temp; 
	 
	return TRUE;    
 
 } 
 
//重采样函数 
//功能:在图象比较大的时候只显示其略图,并生成重采样后的24位bmp文件,其 
//文件名为原文件名+all 
//根据屏幕大小确定采样间隔  
//屏幕宽度  SCREENW 640 or 1024  屏幕高度  SCREENH 480 or 768 
//采样间隔X方向bl1   Y方向bl2 
 
 BOOL CImageDe::ReSample(CString SourseImageFileName) 
 
 {		 
	 if(NULL != m_pData) 
	{ 
		delete [] m_pData; 
		m_pData = NULL; 
	}	 
	  
     CString DesImageFileName; 
	 SourseImageFileName = SourseImageFileName.Left(SourseImageFileName.GetLength()-4)+".bmp";		   
	 //DesImageFileName = _T("c:\\temp\\temp.bmp"); 
     DesImageFileName = SourseImageFileName.Left(SourseImageFileName.GetLength()-4)+"all.bmp";		 
   	 CFile file; 
	 BITMAPFILEHEADER *bmfhr; 
	 BITMAPINFOHEADER *bmihr; 
	 bmfhr=new BITMAPFILEHEADER; 
	 bmihr=new BITMAPINFOHEADER; 
 
	 RGBQUAD rgbpal[256]; 
	 FILE* fpbmp;		 
	fpbmp=fopen(SourseImageFileName,"rb"); 
	fread(bmfhr,sizeof(BITMAPFILEHEADER),1,fpbmp); 
	fread(bmihr,sizeof(BITMAPINFOHEADER),1,fpbmp); 
	if(bmihr->biBitCount ==8) 
    for(int i=0;i<256;i++) 
	  {   
		  fread(&rgbpal[i].rgbBlue,1,1,fpbmp); 
		  fread(&rgbpal[i].rgbGreen,1,1,fpbmp); 
		  fread(&rgbpal[i].rgbRed,1,1,fpbmp); 
		  fread(&rgbpal[i].rgbReserved,1,1,fpbmp); 
	   }        
	fclose(fpbmp); 
	CWaitCursor wait; 
	HDIB hDIB; 
	hFile1 = CreateFile(SourseImageFileName,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE, 
						(LPSECURITY_ATTRIBUTES)NULL,OPEN_EXISTING, 
						FILE_FLAG_RANDOM_ACCESS,(HANDLE)NULL); 
   
	if (hFile1 == INVALID_HANDLE_VALUE)      
    { 
        ASSERT(FALSE); 
		DWORD ss=GetLastError(); 
        return FALSE;        
    } 
     
	hFile = CreateFileMapping( hFile1,NULL,PAGE_READONLY,0,0,NULL); 
	pMapFile1 = (LPSTR)MapViewOfFile(hFile,FILE_MAP_READ,0,0,0); 
   if(pMapFile1 == NULL) return  FALSE; 
 
	LPSTR pFile = (LPSTR)pMapFile1; 
	pFile += sizeof(BITMAPFILEHEADER);	 
	hDIB = (HDIB)pFile; 
 
    LPBITMAPINFOHEADER lpbmi1 = LPBITMAPINFOHEADER(hDIB); 
 
	m_bitcount=(lpbmi1->biBitCount==8)? 8:24; 
	m_imagewidth=lpbmi1->biWidth; 
	m_imageheight=lpbmi1->biHeight; 
 
    long RowByteNum; 
	RowByteNum=((m_imagewidth*m_bitcount)+31)/32*4;  
	long jj= (long)m_imageheight*(long)RowByteNum;	 
  	LPBYTE lpbitRead=(LPBYTE)lpbmi1+sizeof(BITMAPINFOHEADER); 
	if(m_bitcount == 8) lpbitRead+=sizeof(RGBQUAD)*256; 
	BYTE  *tempimage = NULL;    	 
	int nbl1,nbl2; 
    nbl1=(int)m_imagewidth/SCREENW+1;	//若等于1,则采样后的图象不变 
    nbl2=(int)m_imageheight/SCREENH+1; 
    if(nbl1>nbl2)  
		nbl2=nbl1; 
	else 
		nbl1=nbl2;	 
	n_Allwidth= (int)(m_imagewidth/nbl1);//+1 加1有可能大于实际图象数据 
	n_Allheight=(int)(m_imageheight/nbl2);//+1 
    long RowByteNum24; 
	RowByteNum24=((n_Allwidth*24)+31)/32*4;     
	long jj24= n_Allheight*RowByteNum24;		 
	tempimage=new  BYTE[jj24]; 
	 
	int jj1=0; 
	int mi,mj,k,ni,nj; 
	k=0; 
	if(m_bitcount==8)	 
	for(mi=0,ni=0;nibfOffBits =(DWORD)sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);  
	bmfhr->bfType =(WORD)(('M'<<8)|'B'); 
	bmfhr->bfReserved1 =(WORD)0;  
	bmfhr->bfReserved2 =(WORD)0; 	 
	bmfhr->bfSize =(DWORD)(sizeof(BITMAPINFOHEADER)+sizeof(BITMAPFILEHEADER)+jj24); 
	 
	bmihr->biSize =(DWORD)sizeof(BITMAPINFOHEADER);  
	bmihr->biWidth =(long)n_Allwidth;// SCREENW;// 
	bmihr->biHeight =(long)n_Allheight;//(long)height;  
	bmihr->biPlanes =(WORD)1;  
	bmihr->biBitCount =(WORD)24;  
	 
	bmihr->biCompression =(DWORD)BI_RGB;  
	bmihr->biSizeImage =0;  
	bmihr->biXPelsPerMeter =(long)0;  
	bmihr->biYPelsPerMeter =(long)0;  
	bmihr->biClrUsed =(DWORD)0;  
	bmihr->biClrImportant =(DWORD)0; 	 
 
	file.Write(bmfhr,sizeof(BITMAPFILEHEADER)); 
	file.Write(bmihr,sizeof(BITMAPINFOHEADER)); 
	file.Write(tempimage,jj24);// 
	file.Close(); 
	 
	delete bmfhr; 
	delete bmihr; 
	return TRUE;    
 
} 
//判断文件是否已经存在 增加一个系统参数设置bReplace ,注意该函数不限于在打开文件的目录下找 
//返回TRUE表示生成新的文件 
BOOL CImageDe::IsReplace(CString FileName) 
{ 
//   BOOL bReplace;           
   CFileFind finder; 
   BOOL bWorking = finder.FindFile(FileName); 
   int rep; 
   if (bWorking)   
   { 
    rep=AfxMessageBox("文件已存在,是否替换(选YES)还是从现存文件中读取数据(选NO)?",MB_YESNO,0); 
//	finder.Close; 
	   if(rep==IDYES) 
		return TRUE; 
	else  
		return FALSE;			 
   } 
   else 
	   return TRUE; 
 
} 
//读已存在的重采样文件 
//功能: 
//文件名为原文件名+all  为确保正确,文件名有待改进 
//该文件暂时规定为24位 
 BOOL CImageDe::ReadSampleFile(CString SampleImageFileName) 
 
 {		 
	 if(NULL != m_pData) 
	{ 
		delete [] m_pData; 
		m_pData = NULL; 
	}	 
	  
	 BYTE  *tempimage = NULL;    	  
	 BITMAPFILEHEADER *bmfhr; 
	 BITMAPINFOHEADER *bmihr; 
	 bmfhr=new BITMAPFILEHEADER; 
	 bmihr=new BITMAPINFOHEADER; 
	  
    FILE* fpbmp;		 
	fpbmp=fopen(SampleImageFileName,"rb"); 
	CWaitCursor wait; 
	fread(bmfhr,sizeof(BITMAPFILEHEADER),1,fpbmp); 
	fread(bmihr,sizeof(BITMAPINFOHEADER),1,fpbmp); 
	n_Allwidth=bmihr->biWidth; 
	n_Allheight=bmihr->biHeight; 
	 
	if(bmihr->biBitCount !=24) 
	{    
		AfxMessageBox("该文件不是本系统生成的24位重采样文件!"); 
        fclose(fpbmp); 
		return FALSE; 
	} 
	 
	long RowByteNum24; 
	RowByteNum24=((n_Allwidth*24)+31)/32*4;     
	long jj24= n_Allheight*RowByteNum24;		 
	tempimage=new  BYTE[jj24]; 
    fread(tempimage,jj24,1,fpbmp); 
    fclose(fpbmp); 
	m_pData=tempimage;	 
	delete bmfhr; 
	delete bmihr; 
	return TRUE;    
 
} 
 
/////////////////////////////////////////////////////////////////////////////// 
//Function :从图象索引中得到所选box范围的图象数据,只对8位、24位有效 
//参数: 
//	point1,point2为鼠标取的点 
//	m_BoxImage 为新图象的指针数组 
// 当前分辨率  
 
/////////////////////////////////////////////////////////////////////////////// 
 
 
BOOL CImageDe::GetImage(CRect rect,int pscreenX0,int pscreenY0, CRect clientRect,int pan)  
 
//功能:根据BOX范围从索引取数据,并自动重采样 
//参数:以原始图象最左上角为原点建立图象坐标系,X向右,y向下 
//rect 指新图象最左上角和右下角 点在原图象中坐标  
// pscreenX0, pscreenY0 图象显示时左上角在屏幕中的位置 
//clientRect 为当前客户区,根据其确定采样间隔 
//pan为是否漫游及采样间隔 
//返回值:新图象数据 mBoxImage 
 
 { 
	FILE *fp;		 
	CString strIMG = m_CurFileName.Left(m_CurFileName.GetLength()-3)+"img";			 
	 if((fp = fopen(strIMG ,"rb")) == NULL) 
	{ 
		AfxMessageBox("Cannot open the image file!"); 
		return FALSE; 
	} 
	int  dm,Row,Column;	 	  
	//int headoff=6*sizeof(int); 
	int headoff=7*sizeof(int)+4*sizeof(double); 
	if(m_bitcount==8) 
		headoff=headoff+256*sizeof(RGBQUAD); 
	fseek(fp,headoff,1); 
	int offset;//指针移动量 
	int nMaxRow,nMinRow,nMaxCol,nMinCol,totalgrid;                
    dm=m_dm;Row=m_Row;Column=m_Column; 
 
	nMinCol = INT(rect.left / dm); 
	nMinRow = INT((m_TotalHeight-rect.bottom) / dm); 
	//nMinRow = INT((m_imageheight-rect.bottom) / dm); 
	nMaxCol = INT(rect.right / dm); 
	nMaxRow = INT((m_TotalHeight-rect.top) / dm);	 
		 
	if(nMinRow<0) nMinRow=0;  //Row 表示行,Col表示列 
	if(nMaxRow>=Row) nMaxRow=Row-1; 
	if(nMinCol<0) nMinCol=0; 
	if(nMaxCol>=Column) nMaxCol=Column-1; 
 
	int nBeginGridIndex = nMinRow * Column + nMinCol;        
	int num=(nMaxCol-nMinCol+1)*(nMaxRow-nMinRow+1)*dm*dm;   
	int nEndGridIndex = nMaxRow *  Column + nMaxCol; 
	totalgrid=Row*Column; 
		 
	//add for 24 draw 
	 
    if(m_bitcount==8) offset=dm*dm;   
    else if(m_bitcount==24) offset=dm*dm*3;  
    else return FALSE; 
    num=num*3; 
	 
	if(mBoxImage != NULL)   
	{ 
		delete []mBoxImage;			 
		mBoxImage=NULL; 
		 
	} 
	int nbl1,nbl2; 
	m_RealWidth=(nMaxCol-nMinCol+1)*dm;//表示实际图象数据大小 
	m_RealHeight=(nMaxRow-nMinRow+1)*dm; 
	 
	int  clientwide=clientRect.right-clientRect.left; 
	int  clientheight=clientRect.bottom-clientRect.top; 
	//如图象数据大于客户区,则进行采样--点抽取 
	if(pan==0) 
	{ 
		if(m_RealWidth>(clientwide+clientwide/2)||m_RealHeight>(clientheight*3/2)) 
		{ 
		  nbl1=(int)m_RealWidth/clientwide+1;	//若等于1,则采样后的图象不变 
		  nbl2=(int)m_RealHeight/clientheight+1;    
		  if(nbl1>nbl2) //取最大的采样间隔 
		  nbl2=nbl1; 
		  else 
		  nbl1=nbl2; 
		} 
		else 
		{ 
			nbl1=nbl2=1; 
		} 
	} 
	else  //以 
	{ 
		nbl1=pan; 
		nbl2=pan; 
       
	} 
	 
	m_Interval=nbl1;//注意采样间隔和OnLuButtonDown中的比率不一样,它必须为整数 
 
	int Re_dmw,Re_dmh; 
     
	if(nbl1==1) 
	{ 
	datawidth=(nMaxCol-nMinCol+1)*dm/nbl1; 
	dataheight=(nMaxRow-nMinRow+1)*dm/nbl2;	 
	Re_dmw=int(dm/nbl1); 
	Re_dmh=int(dm/nbl2); 
	m_lastleft=nMinCol*dm; 
	m_lasttop=(Row-nMaxRow -1)*dm;//zrf 8-21	-1 or -2 
	} 
	else 
	{ 
	datawidth=(nMaxCol-nMinCol+1)*dm/nbl1+nMaxCol-nMinCol+1;//因为分块的原因,datawidth,dataheight可能大于m_imagewidth 
	dataheight=(nMaxRow-nMinRow+1)*dm/nbl2+nMaxRow-nMinRow+1;//这里加上	nMaxCol-nMinCol+1是为了防止采样时块与块之间相差太大 
	Re_dmw=int(dm/nbl1)+1; 
	Re_dmh=int(dm/nbl2)+1; 
	m_lastleft=nMinCol*dm; 
	m_lasttop=(Row-nMaxRow-1)*dm;	 
	} 
 
	int snum=int(num/(nbl1*nbl2))+nbl1*nbl2; 
	long RowByteNum24; 
	RowByteNum24=((datawidth*24)+31)/32*4; 
	snum=RowByteNum24*(dataheight+2);//+2 ....? 
	mBoxImage = new BYTE[snum]; 
	BYTE *temp = new BYTE[offset]; 
     
	fseek(fp,nBeginGridIndex * offset, 1); 
 
	int jj,ii;//表示已经迭加的块 
	int i; 
	int iRow,iCol; 
	int ki,kj; 
	int ni,nj; 
	ii=0,jj=0; 
	if(m_bitcount==8)	 
		{ 
			for( i = nBeginGridIndex; i < nEndGridIndex + 1; i ++) 
			{ 
				if( i % Column >= nMinCol && i % Column <= nMaxCol ) 
				{ 
					fread(temp,offset,1,fp); 
					iRow=INT(i/Column); 
					iCol=i%Column; 
					   
					  for(ki=0,ni=0;ni= nMinCol && i % Column <= nMaxCol ) 
					{ 
						 
						fread(temp,offset,1,fp); 
						iRow=INT(i/Column); 
						iCol=i%Column; 
						 
						/////////////// 
					  for(ki=0,ni=0;nisnum)continue; 
 
							  mBoxImage[ii*RowByteNum24+jj*3]=temp[ki*dm*3+kj*3]; 
							  mBoxImage[ii*RowByteNum24+jj*3+1]=temp[ki*dm*3+kj*3+1]; 
							  mBoxImage[ii*RowByteNum24+jj*3+2]=temp[ki*dm*3+kj*3+2];						   
							   
					  } 
					} 
					 
					else 
					{			 
						fseek(fp, offset, 1); 
					} 
				} 
			} 
	fclose(fp); 
	 
	if(temp!=NULL)  
	{ 
		delete []temp; 
		temp=NULL; 
	} 
	 
	return TRUE;    
 
 } 
 
 BOOL CImageDe::GetAllImage(CString fileName)  
  
 { 
	/*  
   if(NULL != m_pData) 
	{ 
		delete [] m_pData; 
		m_pData = NULL; 
	} 
	*/ 
 
	m_CurFileName=fileName; 
 
    GetImageInfo(); 
	int nbl1,nbl2; 
	nbl1=(int)m_imagewidth/SCREENW+1;	//若等于1,则采样后的图象不变 
	nbl2=(int)m_imageheight/SCREENH+1; 
	if(nbl1>nbl2)  
		nbl2=nbl1; 
	else 
		nbl1=nbl2;	 
	CRect rect; 
	rect.left=0; 
	rect.top=0; 
	rect.right=m_Column*m_dm; 
	rect.bottom=m_Row*m_dm; 
	//n_Allwidth= (int)(m_imagewidth/nbl1);//+1 加1有可能大于实际图象数据 
	//n_Allheight=(int)(m_imageheight/nbl2);//+1 
     
	if(!GetAllImageData())//第一个rect代表取全部数据,nbl1代表采样间隔 
    return FALSE;   
   // m_pData=mBoxImage;			 
     return TRUE; 
 } 
 
//////////////   取全图的数据 
 BOOL CImageDe::GetAllImageData()  
 { 
	FILE *fp;		 
	CString strIMG = m_CurFileName.Left(m_CurFileName.GetLength()-3)+"img";			 
	 if((fp = fopen(strIMG ,"rb")) == NULL) 
	{ 
		AfxMessageBox("打开索引文件失败!"); 
		return FALSE; 
	} 
	 BYTE *tempimage; 
	int  dm,Row,Column;	 	  
	int headoff=7*sizeof(int)+4*sizeof(double); 
	if(m_bitcount==8) 
		headoff=headoff+256*sizeof(RGBQUAD); 
	fseek(fp,headoff,1); 
	int offset;//指针移动量 
	int nMaxRow,nMinRow,nMaxCol,nMinCol,totalgrid;                
    dm=m_dm;Row=m_Row;Column=m_Column; 
 
	nMinCol = 0; 
	nMinRow = 0; 
	nMaxCol = Column-1; 
	nMaxRow = Row-1;	 
	 
	 
	int nBeginGridIndex = 0;       
	int num=(nMaxCol-nMinCol+1)*(nMaxRow-nMinRow+1)*dm*dm;  //all grid pixes in box 
	int nEndGridIndex = nMaxRow *  Column + nMaxCol; 
	totalgrid=Row*Column; 
		 
	//add for 24 draw 
	 
    if(m_bitcount==8) offset=dm*dm;   
    else if(m_bitcount==24) offset=dm*dm*3;  
    else 
	{  	AfxMessageBox("无法处理该格式,请重新生成索引"); 
		return FALSE; 
	} 
    num=num*3; 
	 
	 if(NULL != m_pData) 
	{ 
		delete [] m_pData; 
		m_pData = NULL; 
	}	 
	int nbl1,nbl2,Re_dmw,Re_dmh; 
    nbl1=(int)Column*dm/SCREENW+1;	//若等于1,则采样后的图象不变 
    nbl2=(int)Row*dm/SCREENH+1; 
    if(nbl1>nbl2)  
		nbl2=nbl1; 
	else 
		nbl1=nbl2;	 
	if(nbl1==1) 
	{ 
	n_Allwidth=int(Column*dm/nbl1); 
	n_Allheight=int(Row*dm/nbl2);	 
	Re_dmw=int(dm/nbl1); 
	Re_dmh=int(dm/nbl2); 
	 
    } 
	else 
	{ 
	n_Allwidth=Column*dm/nbl1+Column; 
	n_Allheight=Row*dm/nbl2+Row; 
	Re_dmw=int(dm/nbl1)+1; 
	Re_dmh=int(dm/nbl2)+1; 
	 
	} 
	 
	long RowByteNum24; 
	RowByteNum24=((n_Allwidth*24)+31)/32*4;     
	long jj24= n_Allheight*RowByteNum24;		 
	tempimage=new  BYTE[jj24]; 
 
	m_RealWidth=Column*dm;//表示实际图象数据大小 
	m_RealHeight=Row*dm; 
	 
 
	 
	datawidth=n_Allwidth; 
	dataheight=n_Allheight;	 
	m_lastleft=0; 
	m_lasttop=0;//zrf 8-21	-1 or -2 
			 
	BYTE *temp = new BYTE[offset]; 
     
	fseek(fp,nBeginGridIndex * offset, 1); 
 
	int jj,ii;//表示已经迭加的块 
	int i; 
	int iRow,iCol; 
	int ki,kj; 
	int ni,nj; 
	ii=0,jj=0; 
	if(m_bitcount==8)	 
		{ 
			for( i = nBeginGridIndex; i < nEndGridIndex + 1; i ++) 
			{ 
				if( i % Column >= nMinCol && i % Column <= nMaxCol ) 
				{ 
					fread(temp,offset,1,fp); 
					iRow=INT(i/Column); 
					iCol=i%Column; 
					   
					  for(ki=0,ni=0;ni= nMinCol && i % Column <= nMaxCol ) 
					{ 
						 
						fread(temp,offset,1,fp); 
						iRow=INT(i/Column); 
						iCol=i%Column; 
						 
						/////////////// 
					  for(ki=0,ni=0;ni