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; ipalPalEntry[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;i255?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; 
}