www.pudn.com > JingXiang-Design-Jeff.rar > BmpFile.cpp
// BmpFile.cpp: implementation of the BmpFile class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "design.h" #include "BmpFile.h" #include#include "SwitchForMethod_0.h" #include "QuickSort.h" #include //#include "DesignView.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction // ////////////////////////////////////////////////////////////////////// BmpFile::BmpFile():CFile() { //Initliaze TmpFile if(::access("~Table~~.xrh",0)) { if(!TmpFile.Open("~Table~~.xrh",modeCreate))//|modeReadWrite)) { CString Msg; Msg.Format("Open Temp File Error,Please Exit The Progame Now!"); ::AfxMessageBox(Msg); } } else if(!TmpFile.Open("~Table~~.xrh",modeReadWrite)) { CString Msg; Msg.Format("Open Temp File Error,Please Exit The Progame Now!"); ::AfxMessageBox(Msg); } StrongBorderMethod=0; //Initliaze The Border Border[0][0][0].x=0; Border[0][0][0].y=0; Border[0][0][1].x=0; Border[0][0][1].y=1; Border[0][0][2].x=0; Border[0][0][2].y=2; Border[0][1][0].x=2; Border[0][1][0].y=0; Border[0][1][1].x=2; Border[0][1][1].y=1; Border[0][1][2].x=2; Border[0][1][2].y=2; Border[1][0][0].x=0; Border[1][0][0].y=0; Border[1][0][1].x=1; Border[1][0][1].y=0; Border[1][0][2].x=2; Border[1][0][2].y=0; Border[1][1][0].x=0; Border[1][1][0].y=2; Border[1][1][1].x=1; Border[1][1][1].y=2; Border[1][1][2].x=2; Border[1][1][2].y=2; Border[2][0][0].x=0; Border[2][0][0].y=0; Border[2][0][1].x=0; Border[2][0][1].y=1; Border[2][0][2].x=1; Border[2][0][2].y=0; Border[2][1][0].x=2; Border[2][1][0].y=1; Border[2][1][1].x=1; Border[2][1][1].y=2; Border[2][1][2].x=2; Border[2][1][2].y=2; Border[3][0][0].x=2; Border[3][0][0].y=0; Border[3][0][1].x=2; Border[3][0][1].y=1; Border[3][0][2].x=1; Border[3][0][2].y=0; Border[3][1][0].x=0; Border[3][1][0].y=1; Border[3][1][1].x=1; Border[3][1][1].y=2; Border[3][1][2].x=0; Border[3][1][2].y=2; pPublicBuffer=NULL; PublicBufferSize=0; pBMPDataForGray=NULL; GrayDataBufferSize=0; RangeOfAreaForLancet=0; BMPFileName="NoName.NoName"; IsLancet=0; SwitchForLancet=0; ::strcpy(ImageType,"*.BMP"); RectSelected=FALSE; SizeOfMemForShow=FIRSTSIZEFORSHOW; pBMPDataForShow=NULL; BMPSelectEnabled=FALSE; pLogPal=NULL; IsGray=FALSE; NonCompressLineSize=0; IsFirstOpen=TRUE; ErrorFlag=-1; pRgbQuad=NULL; pBMPData=NULL; BMP_Ok=FALSE; BMPFileName=""; BMP_IsEmpty=TRUE; EmptyGrayRatio(); //pTheBitmap=new CBitmap(); } BmpFile::~BmpFile() { if(pRgbQuad) delete[] pRgbQuad; if(pBMPData) delete[] pBMPData; if(pBMPDataForShow) delete[] pBMPDataForShow; if(pBMPDataForGray) delete[] pBMPDataForGray; if(IsFileOpen()) Close(); if(IsFileOpen(&TmpFile)) TmpFile.Close(); //Close The Tmp File } BmpFile::BmpFile(CString FileName):CFile(FileName,CFile::modeReadWrite) { //Initliaze TmpFile if(::access("~Table~~.xrh",0)) if(!TmpFile.Open("~Table~~.xrh",modeCreate|modeReadWrite)) { CString Msg; Msg.Format("Open Temp File Error,Please Exit The Progame Now!"); ::AfxMessageBox(Msg); } else if(!TmpFile.Open("~Table~~.xrh",modeReadWrite)) { CString Msg; Msg.Format("Open Temp File Error,Please Exit The Progame Now!"); ::AfxMessageBox(Msg); } StrongBorderMethod=0; //Initliaze The Border Border[0][0][0].x=0; Border[0][0][0].y=0; Border[0][0][1].x=0; Border[0][0][1].y=1; Border[0][0][2].x=0; Border[0][0][2].y=2; Border[0][1][0].x=2; Border[0][1][0].y=0; Border[0][1][1].x=2; Border[0][1][1].y=1; Border[0][1][2].x=2; Border[0][1][2].y=2; Border[1][0][0].x=0; Border[1][0][0].y=0; Border[1][0][1].x=1; Border[1][0][1].y=0; Border[1][0][2].x=2; Border[1][0][2].y=0; Border[1][1][0].x=0; Border[1][1][0].y=2; Border[1][1][1].x=1; Border[1][1][1].y=2; Border[1][1][2].x=2; Border[1][1][2].y=2; Border[2][0][0].x=0; Border[2][0][0].y=0; Border[2][0][1].x=0; Border[2][0][1].y=1; Border[2][0][2].x=1; Border[2][0][2].y=0; Border[2][1][0].x=2; Border[2][1][0].y=1; Border[2][1][1].x=1; Border[2][1][1].y=2; Border[2][1][2].x=2; Border[2][1][2].y=2; Border[3][0][0].x=2; Border[3][0][0].y=0; Border[3][0][1].x=2; Border[3][0][1].y=1; Border[3][0][2].x=1; Border[3][0][2].y=0; Border[3][1][0].x=0; Border[3][1][0].y=1; Border[3][1][1].x=1; Border[3][1][1].y=2; Border[3][1][2].x=0; Border[3][1][2].y=2; pPublicBuffer=NULL; PublicBufferSize=0; pBMPDataForGray=NULL; GrayDataBufferSize=0; RangeOfAreaForLancet=0; BMPFileName=" NoName.NoName"; IsLancet=0; SwitchForLancet=0; ::strcpy(ImageType,"*.BMP"); RectSelected=FALSE; SizeOfMemForShow=FIRSTSIZEFORSHOW; pBMPDataForShow=NULL; BMPSelectEnabled=FALSE; pLogPal=NULL; NonCompressLineSize=0; IsGray=FALSE; IsFirstOpen=TRUE; ErrorFlag=-1; pRgbQuad=NULL; pBMPData=NULL; BMP_Ok=FALSE; BMPFileName=FileName; BMP_IsEmpty=FALSE; EmptyGrayRatio(); GetBmpStruct(); //pTheBitmap=new CBitmap(); } void BmpFile::GetBmpStruct(int ShowMode) { if(BMP_IsEmpty) return; SeekToBegin(); if(Read(&BmpFileHeader,sizeof(BmpFileHeader))!=sizeof(BmpFileHeader)) return; if(Read(&BmpInfoHeader,sizeof(BmpInfoHeader))!=sizeof(BmpInfoHeader)) return; if(!IsBMPFile()) return; if(BmpInfoHeader.biSizeImage==0) BmpInfoHeader.biSizeImage=BmpFileHeader.bfSize-BmpFileHeader.bfOffBits; if(BmpInfoHeader.biSize ==12) { ::AfxMessageBox ("OS/2 Bmp File,I Can't Do it!"); return; //::exit(0); } // !!!! if a OS/2 Format mitmap file,Exit Program! if(BmpInfoHeader.biCompression &&BmpInfoHeader.biBitCount==4) { CString Tmp_; Tmp_.Format("It is RLE_%d",BmpInfoHeader.biBitCount); ::AfxMessageBox (Tmp_); } // Test Is Bmp File RLE if(BmpInfoHeader.biCompression >2) { ::AfxMessageBox ("UnKnow Compress Method!"); return; //::exit(0); } // !!!! if Unknow Method,I Can't Do it,So Exit Program! NonCompressLineSize=LINE_BYTE(((BmpInfoHeader.biWidth*BmpInfoHeader.biBitCount)+7)>>3); NumOfColor=0; ErrorFlag=AskMemoryForBMPData(); ASSERT(ErrorFlag); if(!ErrorFlag) {::AfxMessageBox ("Ask Memmory For BmpData Error,Exit!"); return;//::exit(0); } if(BmpInfoHeader.biBitCount !=24)// if Not True Color ,Get Color Table { NumOfColor=1< up,left->right' to 'up->down,left->right' Close(); mNowWidth=BmpInfoHeader.biWidth; mNowHeight=BmpInfoHeader.biHeight; TotalPoint=mNowWidth*mNowHeight; InfoHeader_Bak=BmpInfoHeader;//BackUp The BMPInfoHeader if(ShowMode) if(!CopyImageDataAsNonCompressionDataToMemForShow()) return; BMP_Ok=TRUE; return; } BOOL BmpFile::GetBmpFile(CString Filename,int ShowMode) { BOOL Ok_Flag=0; if(BMP_Ok) Ok_Flag=TRUE; else Ok_Flag=FALSE; BMP_Ok=FALSE; BMPFileHeader BmpFileHeader_Bak=BmpFileHeader; BMPInfoHeader BmpInfoHeader_Bak=BmpInfoHeader; // ::AfxMessageBox(Filename); try{ ErrorFlag=CFile::Open(Filename,CFile::modeReadWrite|typeBinary); ASSERT(ErrorFlag); } catch(CFileException *e) { e->Delete(); } //afxDump< BMPDataSize) { pMid=(BYTE*)new char[BmpInfoHeader.biSizeImage]; delete[] pBMPData; pBMPData=pMid; BMPDataSize=BmpInfoHeader.biSizeImage; } break; case 4: if(BmpInfoHeader.biCompression) { if(BmpInfoHeader.biSizeImage*2>BMPDataSize) { pMid=(BYTE*)new char[BmpInfoHeader.biSizeImage*2]; delete[] pBMPData; pBMPData=pMid; BMPDataSize=BmpInfoHeader.biSizeImage*2; } } else { if(BmpInfoHeader.biSizeImage>BMPDataSize) { pMid=(BYTE*)new char[BmpInfoHeader.biSizeImage]; delete[] pBMPData; pBMPData=pMid; BMPDataSize=BmpInfoHeader.biSizeImage; } } break; case 8: if(BmpInfoHeader.biCompression) { if(BmpInfoHeader.biSizeImage*2>BMPDataSize) { pMid=(BYTE*)new char[BmpInfoHeader.biSizeImage*2]; delete[] pBMPData; pBMPData=pMid; BMPDataSize=BmpInfoHeader.biSizeImage*2; } } else { if(BmpInfoHeader.biSizeImage>BMPDataSize) { pMid=(BYTE*)new char[BmpInfoHeader.biSizeImage]; delete[] pBMPData; pBMPData=pMid; BMPDataSize=BmpInfoHeader.biSizeImage; } } break ;*/ case 1: case 4: case 8: UINT ByteTmp; ByteTmp=LINE_BYTE(BmpInfoHeader.biWidth)*BmpInfoHeader.biHeight; if(ByteTmp>BMPDataSize) { BMPDataSize=ByteTmp+FIRSTSIZEFORBMPBIT; pMid=(BYTE*)new BYTE[BMPDataSize]; if(!pMid) return FALSE; delete[] pBMPData; pBMPData=pMid; } break; case 24: if(BmpInfoHeader.biSizeImage>BMPDataSize) { pMid=(BYTE*)new char[BmpInfoHeader.biSizeImage+FIRSTSIZEFORBMPBIT]; delete[] pBMPData; pBMPData=pMid; BMPDataSize=BmpInfoHeader.biSizeImage+FIRSTSIZEFORBMPBIT; } break; default:break; } } if(!pBMPData) return FALSE; return TRUE; } BOOL BmpFile::GetBMPData() { Seek(BmpFileHeader.bfOffBits,CFile::begin); switch(BmpInfoHeader.biBitCount) { case 1: if(Read(pBMPData,BmpInfoHeader.biSizeImage)!=BmpInfoHeader.biSizeImage) return FALSE; break; case 4: if(BmpInfoHeader.biCompression) { if(!DecodeForRLE_4()) return FALSE; } else { if(Read(pBMPData,BmpInfoHeader.biSizeImage)!=BmpInfoHeader.biSizeImage) return FALSE; } break; case 8:if(BmpInfoHeader.biCompression) { if(!DecodeForRLE_8()) return FALSE; } else { if(Read(pBMPData,BmpInfoHeader.biSizeImage)!=BmpInfoHeader.biSizeImage) return FALSE; } break; case 24: if(Read(pBMPData,BmpInfoHeader.biSizeImage)!=BmpInfoHeader.biSizeImage) return FALSE; break; default:return FALSE; } return TRUE; } BOOL BmpFile::IsFileOpen(CFile *pFile) { CString FileName; if(!pFile) FileName=CFile::GetFileName(); else FileName=pFile->GetFileName(); return (!FileName.IsEmpty()); } BOOL BmpFile::DecodeForRLE_8(void) { UINT Err; WORD *pBuffer=NULL,MidWord; CHAR MidChar=0; int Lines=0; if(BmpInfoHeader.biBitCount!=8) return FALSE; if(!(pBuffer=new WORD[BmpInfoHeader.biWidth])) return FALSE;// Alloc Memory Error Err= Seek(BmpFileHeader.bfOffBits,CFile::begin); ASSERT(Err==BmpFileHeader.bfOffBits); int BufferSize=0,LineSizeAfterDecode=0;// WORDS while(1) { BufferSize=0; // WORDS while(1) { Err=Read(&MidWord,sizeof(MidWord)); ASSERT(Err==sizeof(MidWord)); pBuffer[BufferSize]=MidWord; BufferSize++; if(MidWord==0||MidWord==0x100) break; } // Decode RLE8,And Write to Buffer LineSizeAfterDecode=0; int i=0; for(i=0;pBuffer[i]!=0&&pBuffer[i]!=0x100;) { if(LOW(pBuffer[i])==0) //First Word is the Low 8 bits { switch(HIGH(pBuffer[i])) { case 0: break; case 1: break; case 2: ::AfxMessageBox ("Delta Appear,I Can't Work! "); return FALSE; default:BYTE *pTmp=(BYTE*)(&pBuffer[i+1]); for(int k=0;k >1); break; } } else { for(int j=0;j =BMPDataSize) { CHAR *pMidBuf=new CHAR[BMPDataSize+BmpInfoHeader.biSizeImage]; ASSERT(pMidBuf); if(!pMidBuf) {delete[] pBuffer; return FALSE;} ::memcpy(pMidBuf,pBMPData,Lines*NonCompressLineSize+LineSizeAfterDecode); delete[] pBMPData; pBMPData=(unsigned char *)pMidBuf; BMPDataSize+=BmpInfoHeader.biSizeImage; } } delete[] pBuffer; return TRUE; } BOOL BmpFile::DecodeForRLE_4() { UINT Err; WORD *pBuffer=NULL,MidWord=0; CHAR MidChar=0; int Lines=0; if(BmpInfoHeader.biBitCount!=4) return FALSE; if(!(pBuffer=new WORD[(BmpInfoHeader.biWidth+1)>>1])) return FALSE;// Alloc Memory Error Err= Seek(BmpFileHeader.bfOffBits,CFile::begin); ASSERT(Err==BmpFileHeader.bfOffBits); int BufferSize=0,LineSizeAfterDecode=0;// WORDS while(1) { BufferSize=0; // WORDS while(1) { Err=Read(&MidWord,sizeof(MidWord)); ASSERT(Err==sizeof(MidWord)); pBuffer[BufferSize]=MidWord; BufferSize++; if(MidWord==0||MidWord==0x100) break; } LineSizeAfterDecode=0; int i=0; for(i=0;pBuffer[i]!=0&&pBuffer[i]!=0x100;) { if(LOW(pBuffer[i])==0) //First Word is the Low 8 bits { switch(HIGH(pBuffer[i])) { case 0: break; case 1: break; case 2: ::AfxMessageBox ("Delta Appear,I Can't Work! "); return FALSE; default: BYTE *pTmp=(BYTE*)(&pBuffer[i+1]); for(int k=0;k<(HIGH(pBuffer[i])>>1);k++) { pBMPData[Lines*NonCompressLineSize+LineSizeAfterDecode]=pTmp[k]; LineSizeAfterDecode++; } i+=1+((((HIGH(pBuffer[i])>>1)+1)>>1)<<1); break; } } else { for(int j=0;j<(LOW(pBuffer[i])>>1);j++) { pBMPData[Lines*NonCompressLineSize+LineSizeAfterDecode]=HIGH(pBuffer[i]); LineSizeAfterDecode++; } i++; } } for(;LineSizeAfterDecode =BMPDataSize) { CHAR *pMidBuf=new CHAR[BMPDataSize+BmpInfoHeader.biSizeImage]; ASSERT(pMidBuf); if(!pMidBuf) {delete[] pBuffer; return FALSE;} ::memcpy(pMidBuf,pBMPData,Lines*NonCompressLineSize+LineSizeAfterDecode); delete[] pBMPData; pBMPData=(unsigned char *)pMidBuf; BMPDataSize+=BmpInfoHeader.biSizeImage; } } delete[] pBuffer; return TRUE; } BOOL BmpFile::GetBmpStatus() { return BMP_Ok; } #define Get_2(Value,x) (((Value)&Mask[x])?1:0) BOOL BmpFile::ShowBitMap(CDC *pDc,int Ratio) { BYTE *pTmp; int _Tmp_i=0,_Tmp_j=0,_Flag_=0; int j=0,i=0,Line_=0,Col_=0;//i is a col count,j is a line count int i_=0,j_=0,f_=0;//counter if(!Ratio||Ratio==-1) Ratio=1; int k=0; // BYTE Mask[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; BYTE Mask[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; switch(BmpInfoHeader.biBitCount) { case 1: if(Ratio<0) { Ratio=-Ratio;// Make Ratio From - to + for(j=0,Line_=0;j<(int)BmpInfoHeader.biHeight;j++) { pTmp=pBMPData+j*(int)NonCompressLineSize; _Tmp_j=j%Ratio; for(i=0,k=0,Col_=0;i<(int)BmpInfoHeader.biWidth;k++) { for(f_=0;f_<8&&i<(int)BmpInfoHeader.biWidth;f_++,i++) { _Tmp_i=i%Ratio; if(!_Tmp_i&&!_Tmp_j) { pDc->SetPixel (Col_,Line_,RGB(pRgbQuad[Get_2(pTmp[k],f_)].rgbRed,pRgbQuad[Get_2(pTmp[k],f_)].rgbGreen,pRgbQuad[Get_2(pTmp[k],f_)].rgbBlue)); Col_++; } } } if(!_Tmp_j) Line_++; } } else { for(j=0,Line_=0;j<(int)BmpInfoHeader.biHeight;j++) { pTmp=pBMPData+j*(int)NonCompressLineSize; for(j_=0;j_ SetPixel (Col_,Line_,RGB(pRgbQuad[Get_2(pTmp[k],f_)].rgbRed,pRgbQuad[Get_2(pTmp[k],f_)].rgbGreen,pRgbQuad[Get_2(pTmp[k],f_)].rgbBlue)); Col_++; } } } Line_++; } } } break; case 4: if(Ratio<0) { Ratio=-Ratio;// Make Ratio From - to + for(j=0,Line_=0;j<(int)BmpInfoHeader.biHeight;j++) { pTmp=pBMPData+j*(int)NonCompressLineSize; _Tmp_j=j%Ratio; for(i=0,k=0,Col_=0;i<(int)BmpInfoHeader.biWidth;k++) { _Tmp_i=i%Ratio; if(!_Tmp_i&&!_Tmp_j) { // pDc->SetPixel (Col_,Line_,RGB(pRgbQuad[pTmp[k]&0x0F].rgbRed,pRgbQuad[pTmp[k]&0x0F].rgbGreen,pRgbQuad[pTmp[k]&0x0F].rgbBlue)); pDc->SetPixel (Col_,Line_,RGB(pRgbQuad[pTmp[k]>>4].rgbRed,pRgbQuad[pTmp[k]>>4].rgbGreen,pRgbQuad[pTmp[k]>>4].rgbBlue)); Col_++; } i++; if(i>=(int)BmpInfoHeader.biWidth) break; _Tmp_i=i%Ratio; if(!_Tmp_i&&!_Tmp_j) { pDc->SetPixel (Col_,Line_,RGB(pRgbQuad[pTmp[k]&0x0F].rgbRed,pRgbQuad[pTmp[k]&0x0F].rgbGreen,pRgbQuad[pTmp[k]&0x0F].rgbBlue)); //pDc->SetPixel (Col_,Line_,RGB(pRgbQuad[pTmp[k]>>4].rgbRed,pRgbQuad[pTmp[k]>>4].rgbGreen,pRgbQuad[pTmp[k]>>4].rgbBlue)); Col_++; } i++; } if(!_Tmp_j) Line_++; } } else { for(j=0,Line_=0;j<(int)BmpInfoHeader.biHeight;j++) { pTmp=pBMPData+j*(int)NonCompressLineSize; for(j_=0;j_ SetPixel (Col_,Line_,RGB(pRgbQuad[pTmp[k]>>4].rgbRed,pRgbQuad[pTmp[k]>>4].rgbGreen,pRgbQuad[pTmp[k]>>4].rgbBlue)); Col_++; } i++; if(i>=(int)BmpInfoHeader.biWidth) break; for(i_=0;i_ SetPixel (Col_,Line_,RGB(pRgbQuad[pTmp[k]&0x0F].rgbRed,pRgbQuad[pTmp[k]&0x0F].rgbGreen,pRgbQuad[pTmp[k]&0x0F].rgbBlue)); Col_++; } i++; } Line_++; } } } break; case 8: if(Ratio<0) { Ratio=-Ratio;// Make Ratio From - to + for(j=0,Line_=0;j<(int)BmpInfoHeader.biHeight;j++) { pTmp=pBMPData+j*(int)NonCompressLineSize; _Tmp_j=j%Ratio; for(i=0,Col_=0;i<(int)BmpInfoHeader.biWidth;i++) { _Tmp_i=i%Ratio; if(!_Tmp_i&&!_Tmp_j) { pDc->SetPixel (Col_,Line_,RGB(pRgbQuad[pTmp[i]].rgbRed,pRgbQuad[pTmp[i]].rgbGreen,pRgbQuad[pTmp[i]].rgbBlue)); Col_++; } } if(!_Tmp_j) Line_++; } } else { for(j=0,Line_=0;j<(int)BmpInfoHeader.biHeight;j++) { pTmp=pBMPData+j*(int)NonCompressLineSize; for(j_=0;j_ SetPixel (Col_,Line_,RGB(pRgbQuad[pTmp[i]].rgbRed,pRgbQuad[pTmp[i]].rgbGreen,pRgbQuad[pTmp[i]].rgbBlue)); Col_++; } } Line_++; } } } break; case 24: if(Ratio<0) { Ratio=-Ratio;// Make Ratio From - to + for(j=0,Line_=0;j<(int)BmpInfoHeader.biHeight;j++) { pTmp=pBMPData+j*(int)NonCompressLineSize; _Tmp_j=j%Ratio; for(k=0,i=0,Col_=0;i<(int)BmpInfoHeader.biWidth;i++,k+=3) { _Tmp_i=i%Ratio; if(!_Tmp_i&&!_Tmp_j) { pDc->SetPixel (Col_,Line_,RGB(pTmp[k+2],pTmp[k+1],pTmp[k])); Col_++; } } if(!_Tmp_j) Line_++; } } else { for(j=0,Line_=0;j<(int)BmpInfoHeader.biHeight;j++) { pTmp=pBMPData+j*(int)NonCompressLineSize; for(j_=0;j_ SetPixel (Col_,Line_,RGB(pTmp[k+2],pTmp[k+1],pTmp[k])); Col_++; } } Line_++; } } } break; default : return FALSE; } return TRUE; } BOOL BmpFile::BmpAdjustData() { BYTE *pData1=NULL,*pData2=NULL; for(int i=0;i<(int)(BmpInfoHeader.biHeight>>1);i++) { pData1=pBMPData+i*NonCompressLineSize; pData2=pBMPData+(BmpInfoHeader.biHeight-i-1)*NonCompressLineSize; Swap((void *)pData1,(void*)pData2,NonCompressLineSize); } return TRUE; } void BmpFile::Swap(void *p1, void *p2, int size) { BYTE *pTmp=NULL; pTmp=new BYTE[size]; if(!pTmp) ::AfxMessageBox ("Ask Memory Error,'Swap' Function in 'bmpfile.cpp'"); ::memcpy(pTmp,p1,size); ::memcpy(p1,p2,size); ::memcpy(p2,pTmp,size); delete[] pTmp; return; } BOOL BmpFile::GetIsGray(void) { return IsGray; } void BmpFile::SetIsGray(BOOL IsOrNot) { IsGray=IsOrNot; return; } void BmpFile::SetBmpStatus(BOOL OkOrNot) { BMP_Ok=OkOrNot; return; } void BmpFile::GetGrayRatio() { if(!GetIsGray())return; // /////////////insert Begin BYTE *pTmp; int Line_=0,Col_=0,k=0,f_=0; // BYTE Mask[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; BYTE Mask[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; EmptyGrayRatio(); switch(BmpInfoHeader.biBitCount) { case 1: for(Line_=0;Line_<(int)BmpInfoHeader.biHeight;Line_++) { pTmp=pBMPData+Line_*(int)NonCompressLineSize; for(Col_=0,k=0;Col_<(int)BmpInfoHeader.biWidth;k++) { for(f_=0;f_<8&&Col_<(int)BmpInfoHeader.biWidth;f_++,Col_++) { // pDc->SetPixel (Col_,Line_,RGB(pRgbQuad[Get_2(pTmp[k],f_)].rgbRed,pRgbQuad[Get_2(pTmp[k],f_)].rgbGreen,pRgbQuad[Get_2(pTmp[k],f_)].rgbBlue)); Points[pRgbQuad[Get_2(pTmp[k],f_)].rgbBlue]++; } } } break; case 4: for(Line_=0;Line_<(int)BmpInfoHeader.biHeight;Line_++) { pTmp=pBMPData+Line_*(int)NonCompressLineSize; for(k=0,Col_=0;Col_<(int)BmpInfoHeader.biWidth;k++) { Points[pRgbQuad[pTmp[k]>>4].rgbBlue]++; Col_++; if(Col_>=(int)BmpInfoHeader.biWidth) break; Points[pRgbQuad[pTmp[k]&0x0f].rgbBlue]++; Col_++; } } break; case 8: for(Line_=0;Line_<(int)BmpInfoHeader.biHeight;Line_++) { pTmp=pBMPData+Line_*(int)NonCompressLineSize; for(Col_=0;Col_<(int)BmpInfoHeader.biWidth;Col_++) { // pDc->SetPixel (Col_,Line_,RGB(pRgbQuad[pTmp[i]].rgbRed,pRgbQuad[pTmp[i]].rgbGreen,pRgbQuad[pTmp[i]].rgbBlue)); Points[pRgbQuad[pTmp[Col_]].rgbBlue]++; } } break; case 24: for(Line_=0;Line_<(int)BmpInfoHeader.biHeight;Line_++) { pTmp=pBMPData+Line_*(int)NonCompressLineSize; for(k=0,Col_=0;Col_<(int)BmpInfoHeader.biWidth;Col_++,k+=3) { Points[pTmp[k]]++; } } break; default: break; } double Tmp; TotalPoint=BmpInfoHeader.biWidth*BmpInfoHeader.biHeight; for(int i=0;i<256;i++) { Tmp=(float)Points[i]/(float)TotalPoint; GrayRatio[i]=(float)Tmp; // For Debug /*if(GrayRatio[i]!=0) { CString TempStr; TempStr.Format("Array_[%d]=%f",i,GrayRatio[i]); AfxMessageBox(TempStr); } */ /////insert End } return; } void BmpFile::EmptyGrayRatio() { memset((void*)Points,0,sizeof(DWORD)*256); memset((void*)GrayRatio,0,sizeof(float)*256); /* for(int i=0;i<256;i++) { Points[i]=0; GrayRatio[i]=0; } */ return; } BOOL BmpFile::SpeedShowBitMap(CDC *pDc, int Ratio) { // pTheBitmap->CreateBitmap(BmpInfoHeader.biWidth,BmpInfoHeader.biHeight,BmpInfoHeader.biPlanes,BmpInfoHeader.biBitCount,pBMPData); // BITMAPINFO *pBIH; float Tmp=1.0; if (Ratio>=0) Tmp=(float)Ratio; else Tmp/=(float)-Ratio; //SetPalette(pDc);//I Don't Know Is It Needed StretchDIBits( pDc->m_hDC, 0, 0, (int)(BmpInfoHeader.biWidth*Tmp),(int)(BmpInfoHeader.biHeight*Tmp), 0,0, BmpInfoHeader.biWidth,BmpInfoHeader.biHeight, pBMPBits, (BITMAPINFO*) pBMPDataForShow, BI_RGB, SRCCOPY ); return TRUE; } BOOL BmpFile::SetPalette(CDC *pDc) { if(BmpInfoHeader.biBitCount>=24) return FALSE; GetBMPPalette(); pOldPalette = pDc->SelectPalette( &thePalette, FALSE ); pDc->RealizePalette(); pDc->SelectPalette( pOldPalette, FALSE ); return TRUE; } BOOL BmpFile::GetBMPPalette() { if(!pLogPal ) { char *ptmp=NULL; int ByteNum=sizeof(LOGPALETTE)+256*sizeof(PALETTEENTRY); pLogPal=(LOGPALETTE *) new BYTE[ByteNum]; } if(!pLogPal) return FALSE; pLogPal->palVersion = 0x300; pLogPal->palNumEntries = NumOfColor; for( int i=0; i palPalEntry[i].peRed =pPalette[i].rgbRed; pLogPal->palPalEntry[i].peGreen =pPalette[i].rgbGreen; pLogPal->palPalEntry[i].peBlue =pPalette[i].rgbBlue; pLogPal->palPalEntry[i].peFlags=0; } int Result=thePalette.CreatePalette( pLogPal ); if(!Result) return FALSE; delete [] pLogPal; return TRUE; } BOOL BmpFile::CopyGrayToShow(void *p_Palette,void *p_Bits) { switch(BmpInfoHeader.biBitCount) { case 1: case 4: case 8:if(!p_Palette) break; memcpy(pPalette,p_Palette,NumOfColor*sizeof(RGBQuad)); break; case 24: if(!p_Bits) break; BmpAdjustData(); memcpy(pBMPBits,p_Bits,BmpInfoHeader.biSizeImage); BmpAdjustData(); break; default:break; } return TRUE; } BOOL BmpFile::GetRectGrayRatio(RECT &rect) { /* //////// For Debug CString TmpNow; */ //if(!GetIsGray()||!RectSelected)return FALSE; //EmptyGrayRatio(); int TmpCount=0; BYTE *pTmp; int Line_=0,Col_=0,k=0,f_=0;; // BYTE Mask[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; BYTE Mask[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; EmptyGrayRatio(); switch(BmpInfoHeader.biBitCount) { case 1: for(Line_=rect.top;Line_<=rect.bottom;Line_++) { pTmp=pBMPData+Line_*(int)NonCompressLineSize; Col_=rect.left; pTmp+=(Col_)>>3;//Becouse Include point(Line_,Col) So pTmp+=(Col_)>>3,Not (Col_+1)>>3 TmpCount=8-((Col_)-(((Col_)>>3)<<3)); if(TmpCount<8) { for(int i=TmpCount-1;i>=0;i--,Col_++) { Points[pRgbQuad[(*pTmp&(1<SetPixel (Col_,Line_,RGB(pRgbQuad[Get_2(pTmp[k],f_)].rgbRed,pRgbQuad[Get_2(pTmp[k],f_)].rgbGreen,pRgbQuad[Get_2(pTmp[k],f_)].rgbBlue)); //int tmp1=Get_2(pTmp[k],f_); // if(tmp1>1&&tmp1<0) ::AfxMessageBox("tmp1=%d",tmp1); //int tmp2=pRgbQuad[tmp1].rgbBlue; // if(tmp2!=24&&tmp2!=48) ::AfxMessageBox("tmp2=%d",tmp2); //Points[tmp2]++; Points[pRgbQuad[Get_2(pTmp[k],f_)].rgbBlue]++; } } } break; case 4: for(Line_=rect.top;Line_<=rect.bottom;Line_++) { pTmp=pBMPData+Line_*(int)NonCompressLineSize; Col_=rect.left; pTmp+=Col_>>1; TmpCount=2-((Col_)-(((Col_)>>1)<<1)); if(TmpCount==1) { Points[pRgbQuad[*pTmp&0x0F].rgbBlue]++; Col_++; pTmp++; } for(k=0;Col_<=rect.right;k++) { Points[pRgbQuad[pTmp[k]>>4].rgbBlue]++; Col_++; if(Col_>=(int)BmpInfoHeader.biWidth) break; Points[pRgbQuad[pTmp[k]&0x0f].rgbBlue]++; Col_++; } } break; case 8: for(Line_=rect.top;Line_<=rect.bottom;Line_++) { pTmp=pBMPData+Line_*(int)NonCompressLineSize; Col_=rect.left; //pTmp+=Col_; for(;Col_<=rect.right;Col_++) { // pDc->SetPixel (Col_,Line_,RGB(pRgbQuad[pTmp[i]].rgbRed,pRgbQuad[pTmp[i]].rgbGreen,pRgbQuad[pTmp[i]].rgbBlue)); Points[pRgbQuad[pTmp[Col_]].rgbBlue]++; } } break; case 24: /* For Debug TmpNow.Format("top=%d,left=%d,bottom=%d,right=%d",rect.top,rect.left,rect.bottom,rect.right); AfxMessageBox(TmpNow); */ for(Line_=rect.top;Line_<=rect.bottom;Line_++) { pTmp=pBMPData+Line_*(int)NonCompressLineSize; Col_=rect.left; pTmp+=Col_*3; for(k=0;Col_<=rect.right;Col_++,k+=3) { Points[pTmp[k]]++; } } break; default: break; } double Tmp; TotalPoint=(rect.bottom-rect.top+1)*(rect.right-rect.left+1); for(int i=0;i<256;i++) { Tmp=(float)Points[i]/(float)TotalPoint; GrayRatio[i]=(float)Tmp; } ////////// return TRUE; } int BmpFile::GetPointGray(int Col,int Line) { if(Line>(int)this->BmpInfoHeader.biHeight-1||Col>(int)this->BmpInfoHeader.biWidth-1) return -1; BYTE *pTmp=NULL; int Gray=-1; int TmpCount=0; pTmp=pBMPData+Line*(int)NonCompressLineSize; // Init The Point To The Line switch(BmpInfoHeader.biBitCount) { case 1: pTmp+=(Col)>>3;//Becouse Include point(Line_,Col) So pTmp+=(Col_)>>3,Not (Col_+1)>>3 TmpCount=8-((Col)-(((Col)>>3)<<3)); Gray=pRgbQuad[(*pTmp&(1<<(TmpCount-1)))?1:0].rgbBlue; break; case 4: pTmp+=Col>>1; TmpCount=2-((Col)-(((Col)>>1)<<1)); if(TmpCount==1) Gray=pRgbQuad[*pTmp&0x0F].rgbBlue; else Gray=pRgbQuad[*pTmp>>4].rgbBlue; break; case 8: pTmp+=Col; Gray=pRgbQuad[*pTmp].rgbBlue; //For Debug /* if(pRgbQuad[*pTmp].rgbBlue!=pRgbQuad[*pTmp].rgbRed||pRgbQuad[*pTmp].rgbBlue!=pRgbQuad[*pTmp].rgbGreen) AfxMessageBox("RgbQuad Error"); if(pPalette[*pTmp].rgbBlue!=pPalette[*pTmp].rgbRed||pPalette[*pTmp].rgbBlue!=pPalette[*pTmp].rgbGreen) AfxMessageBox("Palette Error"); */ //Gray=*pTmp; break; case 24: pTmp+=Col*3; Gray=*pTmp; break; default: return -1; } return Gray; } BOOL BmpFile::GetLancet(int Switch,RECT *pInput,int Switch_) { int Line=0,Col=0,i=0; if(Switch>Switch_&&Switch_>=0) return FALSE; if(!pInput) { pInput=new RECT; pInput->top=pInput->left=0; pInput->bottom=BmpInfoHeader.biHeight-1; pInput->right=BmpInfoHeader.biWidth-1; } BYTE *pTmp=NULL; switch(BmpInfoHeader.biBitCount) { case 8: for(Line=pInput->top;Line<=pInput->bottom;Line++) { pTmp=pBMPData+Line*(int)(NonCompressLineSize); for(Col=pInput->left;Col<=pInput->right;Col++) { if(Switch_<0) { if(pTmp[Col]>=Switch) pTmp[Col]=255; else pTmp[Col]=0; } else { if(pTmp[Col]>=Switch&&pTmp[Col]<=Switch_) pTmp[Col]=255; else pTmp[Col]=0; } } } break; default :return FALSE; } CopyImageDataAsNonCompressionDataToMemForShow(); return TRUE; } BOOL BmpFile::CopyImageDataAsNonCompressionDataToMemForShow() { BYTE *pTmp=NULL; BMPInfoHeader InfoTmp=this->BmpInfoHeader; if(!pBMPDataForShow) pBMPDataForShow= new BYTE[SizeOfMemForShow]; if(!pBMPDataForShow) return FALSE; if(BmpInfoHeader.biSizeImage+256*sizeof(RGBQuad)+sizeof(BMPInfoHeader)>SizeOfMemForShow) { SizeOfMemForShow=BmpInfoHeader.biSizeImage+256*sizeof(RGBQuad)+sizeof(BMPInfoHeader)+500*1024; BYTE * pNewTmp=new BYTE[SizeOfMemForShow]; if(!pNewTmp)return FALSE; delete[] pBMPDataForShow; pBMPDataForShow=pNewTmp; } if(!BmpInfoHeader.biCompression) { pTmp=pBMPDataForShow; memcpy(pTmp,(void*)&BmpInfoHeader,sizeof(BMPInfoHeader)); pTmp+=sizeof(BmpInfoHeader); pPalette=(RGBQuad*) pTmp; if(BmpInfoHeader.biBitCount<24) { memcpy(pTmp,pRgbQuad,(1< SizeOfMemForShow) { SizeOfMemForShow=InfoTmp.biSizeImage+256*sizeof(RGBQuad)+sizeof(BMPInfoHeader)+500*1024; BYTE * pNewTmp=new BYTE[SizeOfMemForShow]; if(!pNewTmp)return FALSE; delete[] pBMPDataForShow; pBMPDataForShow=pNewTmp; pTmp=pBMPDataForShow; } memcpy(pTmp,(void*)&InfoTmp,sizeof(BMPInfoHeader)); pTmp+=sizeof(BMPInfoHeader); pPalette=(RGBQuad *)pTmp; memcpy(pTmp,pRgbQuad,(1< SetPixel (Col_,Line_,RGB(pRgbQuad[Get_2(pTmp[k],f_)].rgbRed,pRgbQuad[Get_2(pTmp[k],f_)].rgbGreen,pRgbQuad[Get_2(pTmp[k],f_)].rgbBlue)); *pTmp_=GET_GRAY(pRgbQuad[Get_2(pTmp[k],f_)].rgbRed, pRgbQuad[Get_2(pTmp[k],f_)].rgbGreen,pRgbQuad[Get_2(pTmp[k],f_)].rgbBlue); /* TmpGray=GET_GRAY(pNowDoc->BitMap.pRgbQuad[i].rgbRed,pNowDoc->BitMap.pRgbQuad[i].rgbGreen, pNowDoc->BitMap.pRgbQuad[i].rgbBlue);*/ } } } break; case 4: for(Line_=0;Line_<(int)BmpInfoHeader.biHeight;Line_++) { pTmp=pBMPData+Line_*(int)NonCompressLineSize; pTmp_=pBMPDataForGray+Line_*(int)NonCompressLineSize_; for(k=0,Col_=0;Col_<(int)BmpInfoHeader.biWidth;k++) { *pTmp_=GET_GRAY(pRgbQuad[pTmp[k]>>4].rgbRed,pRgbQuad[pTmp[k]>>4].rgbGreen,pRgbQuad[pTmp[k]>>4].rgbBlue); Col_++; pTmp_++; if(Col_>=(int)BmpInfoHeader.biWidth) break; *pTmp_=GET_GRAY(pRgbQuad[pTmp[k]&0x0f].rgbRed,pRgbQuad[pTmp[k]&0x0f].rgbGreen,pRgbQuad[pTmp[k]&0x0f].rgbBlue); pTmp_++; Col_++; } } break; case 8: for(Line_=0;Line_<(int)BmpInfoHeader.biHeight;Line_++) { pTmp=pBMPData+Line_*(int)NonCompressLineSize; pTmp_=pBMPDataForGray+Line_*(int)NonCompressLineSize_; for(Col_=0;Col_<(int)BmpInfoHeader.biWidth;Col_++,pTmp_++) { //pDc->SetPixel (Col_,Line_,RGB(pRgbQuad[pTmp[i]].rgbRed,pRgbQuad[pTmp[i]].rgbGreen,pRgbQuad[pTmp[i]].rgbBlue)); *pTmp_=GET_GRAY(pRgbQuad[pTmp[Col_]].rgbRed,pRgbQuad[pTmp[Col_]].rgbGreen,pRgbQuad[pTmp[Col_]].rgbBlue); } } break; case 24: for(Line_=0;Line_<(int)BmpInfoHeader.biHeight;Line_++) { pTmp=pBMPData+Line_*(int)NonCompressLineSize; pTmp_=pBMPDataForGray+Line_*(int)NonCompressLineSize_; for(k=0,Col_=0;Col_<(int)BmpInfoHeader.biWidth;Col_++,k+=3,pTmp_++) { *pTmp_=GET_GRAY(pTmp[k+2],pTmp[k+1],pTmp[k]); } } break; default: break; } /////Now Change The Palette And InfoHeader this->Init_Palette_For_Gray(); BmpInfoHeader.biBitCount=8; BmpInfoHeader.biClrUsed=0; NumOfColor=256; NonCompressLineSize=LINE_BYTE(BmpInfoHeader.biWidth); BmpInfoHeader.biSizeImage=NonCompressLineSize*BmpInfoHeader.biHeight; memcpy(pBMPData,pBMPDataForGray,BmpInfoHeader.biSizeImage); SetIsGray(TRUE); //////////Copy End return TRUE; } BOOL BmpFile::MedianFilter(RECT *pInput_) { int OffSet=0; memcpy(pBMPDataForGray,pBMPData,BmpInfoHeader.biSizeImage); QuickSort Sorting; BYTE ForSort[10]; RECT NeighborArea; BYTE *pIn=NULL,*pOut=NULL; RECT *pInput=new RECT; if(!pInput_) { pInput->left=0; pInput->top=0; pInput->right=BmpInfoHeader.biWidth-1; pInput->bottom=BmpInfoHeader.biHeight-1; } else *pInput=*pInput_; if(pInput->left>0) pInput->left--; if(pInput->right<(int)BmpInfoHeader.biWidth-1) pInput->right++; if(pInput->top>0) pInput->top--; if(pInput->bottom<(int)BmpInfoHeader.biHeight-1)pInput->bottom++;; int Line=0,Col=0; for(Line=pInput->top;Line<=pInput->bottom;Line++) { OffSet=Line*NonCompressLineSize; for(Col=pInput->left;Col<=pInput->right;Col++) { NeighborArea.top=Line; NeighborArea.left=Col; NeighborArea.bottom=Line+2; NeighborArea.right=Col+2; if(NeighborArea.right>pInput->right) break; if(NeighborArea.bottom>pInput->bottom) goto OUT_; pIn=pBMPData+OffSet+NeighborArea.left; memcpy(ForSort,pIn,3); pIn+=NonCompressLineSize; memcpy(ForSort+3,pIn,3); pIn+=NonCompressLineSize; memcpy(ForSort+6,pIn,3); pOut=pBMPDataForGray+OffSet+NeighborArea.left+NonCompressLineSize+1; Sorting.GetInput(ForSort,9); *pOut=Sorting.GetTheMid(); } } OUT_: memcpy(pBMPData,pBMPDataForGray,BmpInfoHeader.biSizeImage); delete pInput; return TRUE; } BOOL BmpFile::StrongBorder(int Method,RECT *pInput_) { int GaoTong[3][3]={1,-2,1,-1,5,-1,1,-2,1}; int ChaFen[3][3]={-1,0,0,0,1,0,0,0,0}; switch(this->StrongBorderMethod) { case 0:Convolution_3_3(pInput_); break; case 1:Convolution_3_3(pInput_,ChaFen); break; case 2:Convolution_3_3(pInput_,GaoTong); break; case 3:LoadLowThought(pInput_); break; default : return ERROR; } return TRUE; } BOOL BmpFile::DetectBorder(RECT *pInput_) { int OffSet=0,Max=-1,TmpMax=-1; memcpy(pBMPDataForGray,pBMPData,BmpInfoHeader.biSizeImage); RECT NeighborArea; BYTE *pIn[3],*pOut=NULL; RECT *pInput=new RECT; if(!pInput_) { pInput->left=0; pInput->top=0; pInput->right=BmpInfoHeader.biWidth-1; pInput->bottom=BmpInfoHeader.biHeight-1; } else *pInput=*pInput_; if(pInput->left>0) pInput->left--; if(pInput->right<(int)BmpInfoHeader.biWidth-1) pInput->right++; if(pInput->top>0) pInput->top--; if(pInput->bottom<(int)BmpInfoHeader.biHeight-1)pInput->bottom++;; int Line=0,Col=0; for(Line=pInput->top;Line<=pInput->bottom;Line++) { OffSet=Line*NonCompressLineSize; for(Col=pInput->left;Col<=pInput->right;Col++) { NeighborArea.top=Line; NeighborArea.left=Col; NeighborArea.bottom=Line+2; NeighborArea.right=Col+2; if(NeighborArea.right>pInput->right) break; if(NeighborArea.bottom>pInput->bottom) goto OUT__; pIn[0]=pBMPData+OffSet+NeighborArea.left; pIn[1]=pIn[0]+NonCompressLineSize; pIn[2]=pIn[1]+NonCompressLineSize; for(int i=0;i<4;i++) { TmpMax= *(pIn[Border[i][0][0].y]+Border[i][0][0].x)+ *(pIn[Border[i][0][1].y]+Border[i][0][1].x)+ *(pIn[Border[i][0][2].y]+Border[i][0][2].x); TmpMax-=*(pIn[Border[i][1][0].y]+Border[i][1][0].x)+ *(pIn[Border[i][1][1].y]+Border[i][1][1].x)+ *(pIn[Border[i][1][2].y]+Border[i][1][2].x); if(TmpMax<0) TmpMax=-TmpMax; if(TmpMax>Max) Max=TmpMax; } Max/=3; pOut=pBMPDataForGray+OffSet+NeighborArea.left+NonCompressLineSize+1; *pOut=(BYTE)Max; } } OUT__: memcpy(pBMPData,pBMPDataForGray,BmpInfoHeader.biSizeImage); delete pInput; return TRUE; } BOOL BmpFile::Convolution(RECT *pInput_, int *Kernel, int Col_Num, int Total_Num) { memcpy(pBMPDataForGray,pBMPData,BmpInfoHeader.biSizeImage); int Line_Num=Total_Num/Col_Num; int Tmp=0; RECT NeighborArea; BYTE **pIn,*pOut=NULL; RECT* pInput=new RECT; pIn=new BYTE*[Line_Num]; int Line=0,Col=0,OffSet=0,i=0,j=0; int StrongBorder_Kernel[3][3]={0,1,0,1,-4,1,0,1,0};//For 拉普拉氏,边缘增强卷积核 if(!Kernel) Kernel=&StrongBorder_Kernel[0][0]; if(!pInput_) { pInput->left=0; pInput->top=0; pInput->right=BmpInfoHeader.biWidth-1; pInput->bottom=BmpInfoHeader.biHeight-1; } else *pInput=*pInput_; ////////// Copy In if(pInput->left>0) pInput->left--; if(pInput->right<(int)BmpInfoHeader.biWidth-1) pInput->right++; if(pInput->top>0) pInput->top--; if(pInput->bottom<(int)BmpInfoHeader.biHeight-1)pInput->bottom++;; for(Line=pInput->top;Line<=pInput->bottom;Line++) { OffSet=Line*NonCompressLineSize; for(Col=pInput->left;Col<=pInput->right;Col++) { NeighborArea.top=Line; NeighborArea.left=Col; NeighborArea.bottom=Line+Line_Num-1; NeighborArea.right=Col+Col_Num-1; if(NeighborArea.right>pInput->right) break; if(NeighborArea.bottom>pInput->bottom) goto OUT___; pIn[0]=pBMPData+OffSet+NeighborArea.left; for(i=1;i 255?255:Tmp; while(Tmp>255) Tmp>>=1; pOut=pBMPDataForGray+OffSet+NeighborArea.left+(Line_Num>>1)*NonCompressLineSize+(Col_Num>>1); *pOut=(BYTE)Tmp; } } OUT___: memcpy(pBMPData,pBMPDataForGray,BmpInfoHeader.biSizeImage); delete pInput; return TRUE; /////////// Copy End } BOOL BmpFile::Convolution_3_3(RECT *pInput_,int Kernel[3][3]) { memcpy(pBMPDataForGray,pBMPData,BmpInfoHeader.biSizeImage); RECT NeighborArea; int OffSet=0,Tmp=0; int Line=0,Col=0,i,j; BYTE *pIn[3],*pOut=NULL; RECT* pInput=new RECT; int StrongBorder_Kernel[3][3]={0,1,0,1,-4,1,0,1,0};//For 拉普拉氏,边缘增强卷积核 //int StrongBorder_Kernel[3][3]={-1,-1,-1,-1,8,-1,-1,-1,-1}; if(!Kernel) Kernel=StrongBorder_Kernel; if(!pInput_) { pInput->left=0; pInput->top=0; pInput->right=BmpInfoHeader.biWidth-1; pInput->bottom=BmpInfoHeader.biHeight-1; } else *pInput=*pInput_; if(pInput->left>0) pInput->left--; if(pInput->right<(int)BmpInfoHeader.biWidth-1) pInput->right++; if(pInput->top>0) pInput->top--; if(pInput->bottom<(int)BmpInfoHeader.biHeight-1)pInput->bottom++;; for(Line=pInput->top;Line<=pInput->bottom;Line++) { OffSet=Line*NonCompressLineSize; for(Col=pInput->left;Col<=pInput->right;Col++) { NeighborArea.top=Line; NeighborArea.left=Col; NeighborArea.bottom=Line+2; NeighborArea.right=Col+2; if(NeighborArea.right>pInput->right) break; if(NeighborArea.bottom>pInput->bottom) goto OUT____; pIn[0]=pBMPData+OffSet+NeighborArea.left; pIn[1]=pIn[0]+NonCompressLineSize; pIn[2]=pIn[1]+NonCompressLineSize; Tmp=0; for(i=0;i<3;i++) for(j=0;j<3;j++) Tmp+=(*(pIn[i]+j))*Kernel[i][j]; Tmp=Tmp<0?-Tmp:Tmp; //Tmp=Tmp>255?255:Tmp; while(Tmp>255) Tmp>>=1; pOut=pBMPDataForGray+OffSet+NeighborArea.left+NonCompressLineSize+1; *pOut=(BYTE)Tmp; } } OUT____: memcpy(pBMPData,pBMPDataForGray,BmpInfoHeader.biSizeImage); delete pInput; return TRUE; } BOOL BmpFile::Convolution_3_3_Float(RECT *pInput_,float Kernel[3][3]) { memcpy(pBMPDataForGray,pBMPData,BmpInfoHeader.biSizeImage); RECT NeighborArea; int OffSet=0; float Tmp=0; int Line=0,Col=0,i,j; BYTE *pIn[3],*pOut=NULL; RECT* pInput=new RECT; float StrongBorder_Kernel[3][3]={(float)0.1,(float)0.1,(float)0.1,// For 低通滤波卷积核 (float)0.1,(float)0.2,(float)0.1, (float)0.1,(float)0.1,(float)0.1}; //int StrongBorder_Kernel[3][3]={-1,-1,-1,-1,8,-1,-1,-1,-1}; if(!Kernel) Kernel=StrongBorder_Kernel; if(!pInput_) { pInput->left=0; pInput->top=0; pInput->right=BmpInfoHeader.biWidth-1; pInput->bottom=BmpInfoHeader.biHeight-1; } else *pInput=*pInput_; if(pInput->left>0) pInput->left--; if(pInput->right<(int)BmpInfoHeader.biWidth-1) pInput->right++; if(pInput->top>0) pInput->top--; if(pInput->bottom<(int)BmpInfoHeader.biHeight-1)pInput->bottom++;; for(Line=pInput->top;Line<=pInput->bottom;Line++) { OffSet=Line*NonCompressLineSize; for(Col=pInput->left;Col<=pInput->right;Col++) { NeighborArea.top=Line; NeighborArea.left=Col; NeighborArea.bottom=Line+2; NeighborArea.right=Col+2; if(NeighborArea.right>pInput->right) break; if(NeighborArea.bottom>pInput->bottom) goto OUT____; pIn[0]=pBMPData+OffSet+NeighborArea.left; pIn[1]=pIn[0]+NonCompressLineSize; pIn[2]=pIn[1]+NonCompressLineSize; Tmp=0; for(i=0;i<3;i++) for(j=0;j<3;j++) Tmp+=(float)(*(pIn[i]+j))*Kernel[i][j]; Tmp=Tmp<0?-Tmp:Tmp; //Tmp=Tmp>255?255:Tmp; while(Tmp>255) Tmp/=2; pOut=pBMPDataForGray+OffSet+NeighborArea.left+NonCompressLineSize+1; *pOut=(BYTE)Tmp; } } OUT____: memcpy(pBMPData,pBMPDataForGray,BmpInfoHeader.biSizeImage); delete pInput; return TRUE; } BOOL BmpFile::LoadLowThought(RECT *pInput_, float Kernel[][3]) { //memcpy(pBMPDataForGray,pBMPData,BmpInfoHeader.biSizeImage); RECT NeighborArea; int OffSet=0; float Tmp=0; int Line=0,Col=0,i,j; BYTE *pIn[3],*pOut=NULL; RECT* pInput=new RECT; float StrongBorder_Kernel[3][3]={(float)0.1,(float)0.1,(float)0.1,// For 低通滤波卷积核 (float)0.1,(float)0.2,(float)0.1, (float)0.1,(float)0.1,(float)0.1}; //int StrongBorder_Kernel[3][3]={-1,-1,-1,-1,8,-1,-1,-1,-1}; if(!Kernel) Kernel=StrongBorder_Kernel; if(!pInput_) { pInput->left=0; pInput->top=0; pInput->right=BmpInfoHeader.biWidth-1; pInput->bottom=BmpInfoHeader.biHeight-1; } else *pInput=*pInput_; if(pInput->left>0) pInput->left--; if(pInput->right<(int)BmpInfoHeader.biWidth-1) pInput->right++; if(pInput->top>0) pInput->top--; if(pInput->bottom<(int)BmpInfoHeader.biHeight-1)pInput->bottom++;; for(Line=pInput->top;Line<=pInput->bottom;Line++) { OffSet=Line*NonCompressLineSize; for(Col=pInput->left;Col<=pInput->right;Col++) { NeighborArea.top=Line; NeighborArea.left=Col; NeighborArea.bottom=Line+2; NeighborArea.right=Col+2; if(NeighborArea.right>pInput->right) break; if(NeighborArea.bottom>pInput->bottom) goto OUT____; pIn[0]=pBMPData+OffSet+NeighborArea.left; pIn[1]=pIn[0]+NonCompressLineSize; pIn[2]=pIn[1]+NonCompressLineSize; Tmp=0; for(i=0;i<3;i++) for(j=0;j<3;j++) Tmp+=(float)(*(pIn[i]+j))*Kernel[i][j]; Tmp=Tmp<0?-Tmp:Tmp; //Tmp=Tmp>255?255:Tmp; while(Tmp>255) Tmp/=2; pOut=pBMPDataForGray+OffSet+NeighborArea.left+NonCompressLineSize+1; *pOut=(BYTE)Tmp; } } OUT____: BYTE *pSrc,*pDest; for(Line=pInput->top;Line<=pInput->bottom;Line++) { OffSet=Line*NonCompressLineSize; for(Col=pInput->left;Col<=pInput->right;Col++) { pSrc=pBMPDataForGray+OffSet+Col; pDest=pBMPData+OffSet+Col; *pDest-=*pSrc; if(*pDest<0) *pDest=-*pDest; } } delete pInput; return TRUE; } BOOL BmpFile::InverseImage(RECT *pInput_) { RECT *pInput=new RECT; if(!pInput_) { pInput->left=0; pInput->top=0; pInput->right=BmpInfoHeader.biWidth-1; pInput->bottom=BmpInfoHeader.biHeight-1; } else *pInput=*pInput_; int Line,Col; BYTE *pTmp=NULL; memcpy(pBMPDataForGray,pBMPData,BmpInfoHeader.biSizeImage); for(Line=pInput->top;Line<=pInput->bottom;Line++) { pTmp=pBMPDataForGray+Line*NonCompressLineSize; for(Col=pInput->left;Col<=pInput->right;Col++) pTmp[Col]=255-pTmp[Col]; } memcpy(pBMPData,pBMPDataForGray,BmpInfoHeader.biSizeImage); delete pInput; return TRUE; } BOOL BmpFile::BrightAdjusting(int Adjust_Num, RECT *pInput_) { int Tmp=0; RECT *pInput=new RECT; if(!pInput_) { pInput->left=0; pInput->top=0; pInput->right=BmpInfoHeader.biWidth-1; pInput->bottom=BmpInfoHeader.biHeight-1; } else *pInput=*pInput_; int Line,Col; BYTE *pTmp=NULL; //memcpy(pBMPDataForGray,pBMPData,BmpInfoHeader.biSizeImage); for(Line=pInput->top;Line<=pInput->bottom;Line++) { pTmp=pBMPData+Line*NonCompressLineSize; for(Col=pInput->left;Col<=pInput->right;Col++) { Tmp=pTmp[Col]; Tmp+=Adjust_Num; Tmp=Tmp<0?0:Tmp; Tmp=Tmp>255?255:Tmp; pTmp[Col]=(BYTE)Tmp; } } // memcpy(pBMPData,pBMPDataForGray,BmpInfoHeader.biSizeImage); delete pInput; return TRUE; }