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;mi
bfOffBits =(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;ni
bfOffBits =(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;ki m_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;ni bfOffBits =(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;ni snum)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