www.pudn.com > JingXiang-Design-Jeff.rar > Image_Identify.cpp


// Image_Identify.cpp: implementation of the Image_Identify class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "Design.h" 
#include "Image_Identify.h" 
#include "MainFrm.h" 
#include "DesignDoc.h" 
#include "DesignView.h" 
#include "BmpFile.h" 
 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
#define FIRST_POINT_BUFFER_NUM 40000 
#define WUCHA  0.01 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
Image_Identify::Image_Identify() 
{ 
  ObjectNum=0; 
   pBits=NULL; 
   NowPointNum=0; 
   BorderFlagGray=1; 
 
  //if(!pBorderPositionBuffer) 
   pBorderPositionBuffer=new BYTE[FIRST_POINT_BUFFER_NUM*sizeof(POINT)]; 
   this->Buffer_Point_Num=FIRST_POINT_BUFFER_NUM; 
   if(!pBorderPositionBuffer)  
   { 
       (AfxGetApp()->m_pMainWnd)->MessageBox("Memory Alloc Error,File--'Image_Identify.cpp',Function--Image_Identify::Image_Identify()","内存分配错误",MB_OK|MB_ICONERROR); 
	   //(CFrameWnd*) (AfxGetApp()->m_pMainWnd)->SendMessage(WM_QUIT); 
	   ::AfxPostQuitMessage(0); 
   } 
 EndPoint.x=-1; 
 EndPoint.y=-1; 
 
// Init The Detect Order  
  Order[0].x=0; 
  Order[0].y=-1; 
  Order[1].x=-1; 
  Order[1].y=-1; 
  Order[2].x=-1; 
  Order[2].y=0; 
  Order[3].x=-1; 
  Order[3].y=1; 
  Order[4].x=0; 
  Order[4].y=1; 
  Order[5].x=1; 
  Order[5].y=1; 
  Order[6].x=1; 
  Order[6].y=0; 
  Order[7].x=1; 
  Order[7].y=-1; 
  pForProcess=NULL; 
  pForProcess_bit=NULL; 
 
 
 
} 
 
Image_Identify::~Image_Identify() 
{ 
 if(pBorderPositionBuffer)  
	 delete[] pBorderPositionBuffer; 
 if(pForProcess_bit) 
	 delete[]pForProcess_bit; 
 
} 
 
BOOL Image_Identify::GetNormalInfo(BMPInfoHeader Info_In, BYTE *pBitsData) 
{ 
	InfoHeader=Info_In; 
	pBits=pBitsData; 
	if(!pForProcess_bit) 
	{  this->ForProcessBufferSize=Info_In.biSizeImage*sizeof(WORD); 
		this->pForProcess_bit=new BYTE[ForProcessBufferSize]; 
	} 
	else 
	{ 
        if((int)(Info_In.biSizeImage*sizeof(WORD))>ForProcessBufferSize) 
		{ 
		  this->ForProcessBufferSize=Info_In.biSizeImage*sizeof(WORD); 
          BYTE *pTmp=new BYTE[ForProcessBufferSize]; 
		  delete[]pForProcess_bit; 
		  pForProcess_bit=pTmp; 
 
		} 
	} 
	 
	if(!pForProcess_bit)  
   { 
       (AfxGetApp()->m_pMainWnd)->MessageBox("Memory Alloc Error,File--'Image_Identify.cpp',Function--Image_Identify::Get_NormalInfo()","内存分配错误",MB_OK|MB_ICONERROR); 
	   //(CFrameWnd*) (AfxGetApp()->m_pMainWnd)->SendMessage(WM_QUIT);										     
	   ::AfxPostQuitMessage(0); 
   } 
 pForProcess=(WORD *) pForProcess_bit; 
 
    CopyToForProcess(); 
 
 
	return TRUE; 
} 
 
BOOL Image_Identify::BorderDetect(RECT *pInput_,int IsFor_Left_Top_Out,int IsDrawing ,int BorderGray,int BkGray) 
{    
	RECT *pInput=pInput_; 
	int FlagTmp=0; 
	NowPointNum=0; 
	BorderFlagGray=1; 
	ObjectNum=0; 
	POINT *pPoint=NULL; 
	if(!pInput_) return FALSE; 
    int Col,Line; 
	int Flag=0; 
	while(1) 
	{ 
		 Flag=0; 
       for(Line=pInput->top;Line<=pInput->bottom;Line++) 
		    for(Col=pInput->left;Col<=pInput->right;Col++) 
			{ 
				int GrayBak=PointGray(Col,Line); 
                
				if(GrayBak!=BorderGray&&GrayBak!=BkGray) 
				{ 
                  
				int Flag_=0; 
				int Bak_ =Col; 
				 for(;Col<=pInput->right;Col++) 
				  if(PointGray(Col,Line)==BkGray) 
				   { Flag_=1;break;} 
				  
				   if(!Flag_) continue; 
				   //if(Col>pInput->right) continue; 
				 
				} 
              /*// For Debug   
				 if(Col==223&&Line==67) 
					 this->NowPointNum=0; 
				 // End  
             */ 
			 	if(PointGray(Col,Line)==BorderGray&&!this->Is_InSidePoint_For_4(Col,Line)) 
				//if(PointGray(Col,Line)==BorderGray&&(Col<=0||Col>=(int)this->InfoHeader.biWidth-1||(PointGray(Col-1,Line)==BkGray||PointGray(Col+1,Line)==BkGray))) 
				{  
				  Flag=1; 
				  this->NowPointNum=0; 
				  this->Detecting(*pInput_,Col,Line,&FlagTmp,IsFor_Left_Top_Out); 
                  //For Debug 
                 // this->NowPointNum=0; 
				  //if(NowPointNum<=2) 
                   //this->Detecting(Col,Line,&FlagTmp,IsFor_Left_Top_Out); 
    
 
 
				  //Debug End 
                  if(IsDrawing) 
				  if(FlagTmp)    
                   this->DrawBorder(); 
				  // Col=pInput->left; 
				   //	Line=pInput->top; 
					 
				   Col--; 
				   //return TRUE; 
 
				} 
			} 
	   if(!Flag) break; 
	} 
 
	 
	return TRUE; 
} 
 
int Image_Identify::PointGray(int x, int y) 
{  
	/*if(x<0||y<0) return -1; 
	if(x>(int)InfoHeader.biWidth-1||y>(int)InfoHeader.biHeight-1)  return -1; 
	 if (!pBits) return -1; 
     int TheGray=-1; 
     int NonCompressLineSize=LINE_BYTE(InfoHeader.biWidth); 
      BYTE*pTmp=NULL; 
     pTmp=pBits+y*(int)NonCompressLineSize+x; // Init The Point To The Line 
     TheGray=*pTmp;*/ 
    if(x<0||y<0) return -1; 
	if(x>(int)InfoHeader.biWidth-1||y>(int)InfoHeader.biHeight-1)  return -1; 
	 if (!pBits) return -1; 
     int TheGray=-1; 
     int NonCompressLineSize=LINE_BYTE(InfoHeader.biWidth); 
       WORD *pTmp=NULL; 
     pTmp=pForProcess+(y*(int)NonCompressLineSize+x); // Init The Point To The Line 
     TheGray=*pTmp; 
 
 
     return TheGray; 
} 
 
BOOL Image_Identify::Detecting(RECT RectIn_,int Col,int Line,int* pReturnValue// if Some Object Out The Selected Rect You Selected it =0,else =1 
							   ,int IsFor_Left_Top_Out,int TheBorderGray,int BkGray) 
{ 
	CString StrTmp11; 
    BYTE *pTmp=NULL; 
	POINT *pPoint=NULL; 
    int Tmp=0,Flag=0;; 
	int x=Col,y=Line,i=0; 
	int x_=Col,y_=Line; 
    if(PointGray(x,y)!=TheBorderGray||this->Is_InSidePoint(x,y)) return FALSE; 
	// For Debug 
	NowPointNum=0; 
	CDesignView *pDesignView; 
    CMainFrame* pMFrame=(CMainFrame*)(AfxGetApp()->m_pMainWnd); 
    pDesignView=(CDesignView*)pMFrame->GetActiveView(); 
	CClientDC ClDc(pDesignView); 
	// End 
 
    StartNeighbour=0;NowNeighbour=0; 
    pPoint=(POINT*)(pBorderPositionBuffer);//sizeof(POINT)*NowPointNum); 
	if(NowPointNum>=Buffer_Point_Num)// Detect Is Memory OverLoad 
	{ 
       Buffer_Point_Num+=FIRST_POINT_BUFFER_NUM; 
	   pTmp=new BYTE[Buffer_Point_Num*sizeof(POINT)]; 
	  if(!pTmp)  
	  { 
       (AfxGetApp()->m_pMainWnd)->MessageBox("Memory Alloc Error,File--'Image_Identify.cpp',Function--Image_Identify::Detecting()","内存分配错误",MB_OK|MB_ICONERROR); 
	   //(CFrameWnd*) (AfxGetApp()->m_pMainWnd)->SendMessage(WM_QUIT); 
	   ::AfxPostQuitMessage(0); 
	  } 
       ::memcpy(pTmp,pBorderPositionBuffer,NowPointNum*sizeof(POINT)); 
	   delete[] pBorderPositionBuffer; 
	   pBorderPositionBuffer=pTmp; 
	    pPoint=(POINT*)pBorderPositionBuffer; 
 
	} 
      
	pPoint[NowPointNum].x=Col; 
	 pPoint[NowPointNum].y=Line; 
//	 SetPointGray(pPoint[NowPointNum].x,pPoint[NowPointNum].y,BorderFlagGray); 
	/* 
	 StrTmp11.Format("X=%d,Y=%d",pPoint[NowPointNum].x,pPoint[NowPointNum].y); 
	  AfxMessageBox(StrTmp11); 
	 ClDc.SetPixel(pPoint[NowPointNum],RGB(255,0,255)); 
	 */ 
	   NowPointNum++; 
    
	    while(PointGray(Order[StartNeighbour].x+x_,Order[StartNeighbour].y+y_)!=255) 
		{ 
			StartNeighbour++;   
			if(	StartNeighbour>7) break; 
			if(Order[StartNeighbour].x+x_<0|| 
			   Order[StartNeighbour].y+y_<0|| 
			   Order[StartNeighbour].x+x_>(int)InfoHeader.biWidth-1|| 
			   Order[StartNeighbour].y+y_>(int)InfoHeader.biHeight-1 
			   ) 
			break; 
		} 
		while(1) 
		{ 
         Flag=0;   
          for(i=0;i<8;i++)// 8 Neighbour Rule 
		  {      
			Tmp=StartNeighbour+i; 
            //NowNeighbour=Tmp-((Tmp>>3)<<3);// Cycle 
            NowNeighbour=Tmp&0x07; 
		    x=this->Order[NowNeighbour].x+x_; 
			y=this->Order[NowNeighbour].y+y_; 
 
            //For Debug 
            /* 
			CString StrTmp2; 
			 StrTmp2.Format("X=%d,Y=%d!",x,y); 
			 AfxMessageBox(StrTmp2); 
             */ 
 
			if(x<0) 
				continue; 
			if(y<0)  
				 continue; 
			if(x>(int)InfoHeader.biWidth-1)  
			     // x=(int)InfoHeader.biWidth-1; 
				 continue; 
			if(y>(int)InfoHeader.biHeight-1) 
				 	  continue; 
		/*	 // For Debug   
				 if(x==145&&y==104) 
					x=x; 
				 // End  
				 */ 
 
		     if(x==Col&&y==Line) 
				{	 
				/* 
				 // For  Debug 
				CString StrTmp1; 
			    StrTmp1.Format("Closed"); 
			    AfxMessageBox(StrTmp1); 
				*/ 
		        break; // If Go To The First Point,then End the cycle--the While Cycle 
				} 
			if(PointGray(x,y)==TheBorderGray) 
			{   
	    	  if(!Is_InSidePoint_For_4(x,y)) 
			  {	 
                
				  //For Debug 
				   
			 
			    /*StrTmp11.Format("X=%d,Y=%d",x,y); 
			    AfxMessageBox(StrTmp11);*/ 
 
 
 
 
				  //End 
				if(NowPointNum>=Buffer_Point_Num)// Detect Is Memory OverLoad 
				{ 
                      Buffer_Point_Num+=FIRST_POINT_BUFFER_NUM; 
					    
	                   pTmp=new BYTE[Buffer_Point_Num*sizeof(POINT)]; 
                      if(!pTmp)  
					  { 
                        (AfxGetApp()->m_pMainWnd)->MessageBox("Memory Alloc Error,File--'Image_Identify.cpp',Function--Image_Identify::Detecting()","内存分配错误",MB_OK|MB_ICONERROR); 
	                       ::AfxPostQuitMessage(0); 
					  } 
                       ::memcpy(pTmp,pBorderPositionBuffer,NowPointNum*sizeof(POINT)); 
	                   delete[] pBorderPositionBuffer; 
	                   pBorderPositionBuffer=pTmp; 
					   pPoint=(POINT*)pBorderPositionBuffer; 
				} 
 
				 pPoint[NowPointNum].x=x; //BackUp the Border Point 
	             pPoint[NowPointNum].y=y; 
	         // SetPointGray(pPoint[NowPointNum].x,pPoint[NowPointNum].y,BorderFlagGray); 
				 
			/*	   //For Debug 
				   
			 
			    StrTmp11.Format("X=%d,Y=%d",pPoint[NowPointNum].x,pPoint[NowPointNum].y); 
			    AfxMessageBox(StrTmp11); 
 
                ClDc.SetPixel(pPoint[NowPointNum],RGB(255,0,255)); 
 
 
 
				  //End 
				  */ 
 
				 NowPointNum++; 
				 Flag=1; 
		  		 x_=x;y_=y; 
				 //StartNeighbour=NowNeighbour+5>7?NowNeighbour-3:NowNeighbour+5; 
                   StartNeighbour=(NowNeighbour+5)&0x07; 
				break; 
			  } 
			} 
 	 
		  } 
		 if (!Flag) 
		 { 
			/* 
			//For Debug 
             CString StrTmp; 
			 StrTmp.Format("X=%d,Y=%d!",x,y); 
			 AfxMessageBox(StrTmp); 
			 */ 
			  
			 break; 
		 } 
		     
	} 
 
	pPoint[NowPointNum]=EndPoint; 
	NowPointNum++; 
    
/*	//For Debug 
  if(NowPointNum<=2) 
  { 
  
 
			 
	            CString StrTmp3; 
			    StrTmp3.Format("%d,The Only One Point is X=%d,Y=%d!",NowPointNum,pPoint[0].x,pPoint[0].y); 
			    AfxMessageBox(StrTmp3); 
			 
 
  }*/ 
 
	/*if(BorderFlagGray<255) 
	{ 
      // Set The Border Flag 
	   for(i=0;iSetPointGray(pPoint[i].x,pPoint[i].y,BorderFlagGray); 
	   } 
	    
	   BorderFlagGray++; 
    //  if(BorderFlagGray==255) BorderFlagGray=256; 
	   } 
	else 
     (AfxGetApp()->m_pMainWnd)->MessageBox("Too Many Area Block 'Image_Identify.cpp',Function--Image_Identify::Detecting()","区域太多",MB_OK|MB_ICONERROR); 
   */ 
       for(i=0;iSetPointGray(pPoint[i].x,pPoint[i].y,BorderFlagGray); 
	   } 
 
 // For Debug  
 
              /* CString StrTmp3; 
			    StrTmp3.Format("The Total Point is X=%d",NowPointNum-1); 
			    AfxMessageBox(StrTmp3); 
				*/ 
	 
		for(i=0;i(int)InfoHeader.biWidth-1||Line>(int)InfoHeader.biHeight-1)  return -1; 
 
     int NonCompressLineSize=LINE_BYTE(InfoHeader.biWidth); 
     BYTE *pTmp=NULL; 
     pTmp=pBits+Line*(int)NonCompressLineSize+Col; // Init The Point To The Line 
     *pTmp=SetGray; 
     return TRUE; 
	 */ 
  
	 if (!pBits) FALSE; 
      
	 if(Col<0||Line<0) return -1; 
	 if(Col>(int)InfoHeader.biWidth-1||Line>(int)InfoHeader.biHeight-1)  return -1; 
 
     int NonCompressLineSize=LINE_BYTE(InfoHeader.biWidth); 
     WORD *pTmp=NULL; 
     pTmp=pForProcess+(Line*(int)NonCompressLineSize+Col); // Init The Point To The Line 
     *pTmp=SetGray; 
     return TRUE; 
} 
 
BOOL Image_Identify::Is_InSidePoint(int x, int y, int Out) 
{ 
  int i=0; 
  int x_,y_; 
  for(i=0;i<8;i++) 
  { 
    x_=Order[i].x+x; 
	y_=Order[i].y+y; 
	 
            if(x_<0) 
				return FALSE;  
			if(y_<0)  
				return FALSE;  
			if(x_>(int)InfoHeader.biWidth-1)  
			     // x=(int)InfoHeader.biWidth-1; 
			    return FALSE;  
			if(y_>(int)InfoHeader.biHeight-1) 
				  //y=(int)InfoHeader.biHeight-1; 
				 return FALSE;  
 
            if(PointGray(x_,y_)==Out) 
				return FALSE;  
  } 
	return TRUE; 
} 
 
void Image_Identify::DrawBorder() 
{ 
                  POINT *pPoint=NULL; 
                  CDesignView *pDesignView; 
	              CMainFrame* pMFrame=(CMainFrame*)(AfxGetApp()->m_pMainWnd); 
                  pDesignView=(CDesignView*)pMFrame->GetActiveView(); 
                  CClientDC ClDc(pDesignView); 
				  POINT PointTmp[2]; 
				  CPoint OrgPoint; 
                  OrgPoint=pDesignView->GetScrollPosition(); 
				  pPoint=(POINT*)(pBorderPositionBuffer); 
                  for(int j=0;jmNowRatio>=0) 
					  { 
                         PointTmp[0].x=pPoint[j].x*pDesignView->mNowRatio; 
						 PointTmp[0].y=pPoint[j].y*pDesignView->mNowRatio; 
						 /*if(!j) 
						 StrtPoint=PointTmp[0];*/ 
 
                         if(j+1>=NowPointNum-1) 
						 { 
					     PointTmp[1].x=pPoint[0].x*pDesignView->mNowRatio; 
                         PointTmp[1].y=pPoint[0].y*pDesignView->mNowRatio; 
			 
						 } 
						 else 
						 { 
					     PointTmp[1].x=pPoint[j+1].x*pDesignView->mNowRatio; 
                         PointTmp[1].y=pPoint[j+1].y*pDesignView->mNowRatio; 
						 } 
					  } 
    				  else 
					  { 
						  PointTmp[0].x=pPoint[j].x/-pDesignView->mNowRatio; 
						  PointTmp[0].y=pPoint[j].y/-pDesignView->mNowRatio; 
						  
						   if(j+1>=NowPointNum-1) 
						   { 
						    PointTmp[1].x=pPoint[0].x/-pDesignView->mNowRatio; 
                            PointTmp[1].y=pPoint[0].y/-pDesignView->mNowRatio; 
						   } 
						   else 
						   { 
							PointTmp[1].x=pPoint[j+1].x/-pDesignView->mNowRatio; 
                            PointTmp[1].y=pPoint[j+1].y/-pDesignView->mNowRatio; 
		 
						   } 
 
					  } 
 
 
                        
						PointTmp[0].x-=OrgPoint.x; 
						PointTmp[0].y-=OrgPoint.y; 
 
						PointTmp[1].x-=OrgPoint.x; 
						PointTmp[1].y-=OrgPoint.y; 
 
 
				  if(pPoint[j].x==EndPoint.x&&pPoint[j].y==EndPoint.y) break; 
				   //ClDc.SetPixel(PointTmp,RGB(255,0,0)); 
				   //CPen newPen(PS_SOLID,1,RGB(255,125,100)); 
		           CPen newPen(PS_SOLID,1,RGB(255,0,255)); 
				  CPen *pOldPen=ClDc.SelectObject(&newPen); 
				   ClDc.MoveTo(PointTmp[0]); 
				   ClDc.LineTo(PointTmp[1]); 
				   
				   ClDc.SelectObject(pOldPen); 
				  //ClDc.SetPixel(PointTmp[0],RGB(255,0,255)); 
 
				    if(NowPointNum<=2) 
						ClDc.SetPixel(PointTmp[0],RGB(255,0,255)); 
 
				  } 
					return; 
} 
 
BOOL Image_Identify::CopyToForProcess() 
{ 
 
  for(int i=0;i<(int)InfoHeader.biSizeImage;i++) 
      pForProcess[i]=pBits[i]; 
 
   
 
 
return TRUE; 
} 
 
BOOL Image_Identify::IsOutOfLeft_Top(RECT RectIn) 
{ 
      CDesignView *pDesignView; 
	 CDesignDoc *pDoc; 
	 CMainFrame* pMFrame=(CMainFrame*)(AfxGetApp()->m_pMainWnd); 
      pDesignView=(CDesignView*)pMFrame->GetActiveView(); 
	  pDoc=pDesignView->GetDocument(); 
 
	POINT *pPoint=NULL; 
	pPoint=(POINT*)pBorderPositionBuffer; 
  for(int i=0;i(int)InfoHeader.biWidth-1)  
			     // x=(int)InfoHeader.biWidth-1; 
			    return FALSE;  
			if(y_>(int)InfoHeader.biHeight-1) 
				  //y=(int)InfoHeader.biHeight-1; 
				 return FALSE;  
 
            if(PointGray(x_,y_)==Out) 
				return FALSE;  
  } 
	return TRUE; 
} 
 
BOOL Image_Identify::Is_InLine(POINT Start, POINT End) 
{ 
   POINT *pPoint=(POINT*)pBorderPositionBuffer; 
   int i=0; 
   if (Start.x=End.x&&Start.y==End.y) return FALSE; 
   if(Start.x==End.x) 
   { 
      for(i=0;i=-WUCHA)  
				  return TRUE; 
		   }  
		   return FALSE; 
 
	 } 
} 
 
BOOL Image_Identify::Is_BetweenTwo(int x1, int x2, int in) 
{ 
 int max,min; 
  if(x1>x2) 
  {max=x1;min=x2;} 
  else 
  {max=x2;min=x1;} 
  if(in>=min&&in<=max) 
	   return TRUE; 
  else 
	  return FALSE; 
 
} 
 
int Image_Identify::BorderDetect_For_Lizijianju(POINT Start, POINT End, RECT *pInput_,int IsDrawing, int BorderGray, int BkGray) 
{ 
          
    int PointNum=0; 
	RECT *pInput=pInput_; 
	int FlagTmp=0; 
	NowPointNum=0; 
	BorderFlagGray=1; 
	ObjectNum=0; 
	POINT *pPoint=NULL; 
	if(!pInput_) return FALSE; 
    int Col,Line; 
	int Flag=0; 
	while(1) 
	{ 
		 Flag=0; 
       for(Line=pInput->top;Line<=pInput->bottom;Line++) 
		    for(Col=pInput->left;Col<=pInput->right;Col++) 
			{ 
				int GrayBak=PointGray(Col,Line); 
                
				if(GrayBak!=BorderGray&&GrayBak!=BkGray) 
				{ 
                  
				int Flag_=0; 
				int Bak_ =Col; 
				 for(;Col<=pInput->right;Col++) 
				  if(PointGray(Col,Line)==BkGray) 
				   { Flag_=1;break;} 
				  
				   if(!Flag_) continue; 
				   //if(Col>pInput->right) continue; 
				 
				} 
              /*// For Debug   
				 if(Col==223&&Line==67) 
					 this->NowPointNum=0; 
				 // End  
             */ 
			 	if(PointGray(Col,Line)==BorderGray&&!this->Is_InSidePoint_For_4(Col,Line)) 
				//if(PointGray(Col,Line)==BorderGray&&(Col<=0||Col>=(int)this->InfoHeader.biWidth-1||(PointGray(Col-1,Line)==BkGray||PointGray(Col+1,Line)==BkGray))) 
				{  
				  Flag=1; 
				  this->NowPointNum=0; 
				  this->Detecting(*pInput_,Col,Line,&FlagTmp,0); 
                  //For Debug 
                 // this->NowPointNum=0; 
				  //if(NowPointNum<=2) 
                   //this->Detecting(Col,Line,&FlagTmp,IsFor_Left_Top_Out); 
                    if(Is_InLine(Start,End)) 
						PointNum++; 
                     
                      
				  //Debug End 
                  if(IsDrawing) 
				     this->DrawBorder(); 
				  // Col=pInput->left; 
				   //	Line=pInput->top; 
					 
				   Col--; 
				   //return TRUE; 
 
				} 
			} 
	   if(!Flag) break; 
	} 
 
	 
	return PointNum; 
} 
 
 
void Image_Identify::Swap_int(int& x1, int& x2) 
{ 
 
	int Tmp=x1; 
	x1=x2; 
	x2=Tmp; 
return; 
} 
 
int Image_Identify::BorderDetect_For_LiZiZhiJing(RECT *pInput_, int IsFor_Left_Top_Out, int IsDrawing, int BorderGray, int BkGray) 
{ 
     
	CDesignView *pDesignView; 
	CDesignDoc *pDoc; 
	CMainFrame* pMFrame=(CMainFrame*)(AfxGetApp()->m_pMainWnd); 
    pDesignView=(CDesignView*)pMFrame->GetActiveView(); 
	pDoc=pDesignView->GetDocument(); 
	  
 
  
	RECT *pInput=pInput_; 
	int FlagTmp=0; 
	NowPointNum=0; 
	BorderFlagGray=1; 
	ObjectNum=0; 
	POINT *pPoint=NULL; 
	if(!pInput_) return FALSE; 
    int Col,Line; 
	int Flag=0; 
	while(1) 
	{ 
		 Flag=0; 
       for(Line=pInput->top;Line<=pInput->bottom;Line++) 
		    for(Col=pInput->left;Col<=pInput->right;Col++) 
			{ 
				int GrayBak=PointGray(Col,Line); 
                
				if(GrayBak!=BorderGray&&GrayBak!=BkGray) 
				{ 
                  
				int Flag_=0; 
				int Bak_ =Col; 
				 for(;Col<=pInput->right;Col++) 
				  if(PointGray(Col,Line)==BkGray) 
				   { Flag_=1;break;} 
				  
				   if(!Flag_) continue; 
				   //if(Col>pInput->right) continue; 
				 
				} 
              /*// For Debug   
				 if(Col==223&&Line==67) 
					 this->NowPointNum=0; 
				 // End  
             */ 
			 	if(PointGray(Col,Line)==BorderGray&&!this->Is_InSidePoint_For_4(Col,Line)) 
				//if(PointGray(Col,Line)==BorderGray&&(Col<=0||Col>=(int)this->InfoHeader.biWidth-1||(PointGray(Col-1,Line)==BkGray||PointGray(Col+1,Line)==BkGray))) 
				{  
				  Flag=1; 
				  this->NowPointNum=0; 
				  this->Detecting(*pInput_,Col,Line,&FlagTmp,IsFor_Left_Top_Out); 
                  if(ObjectNum>0) 
				  pDesignView->pPara_Detect->AreaPoint[ObjectNum-1] 
				  			  =GetAcreagePointNum(); 
				   
				  //For Debug 
                 // this->NowPointNum=0; 
				  //if(NowPointNum<=2) 
                   //this->Detecting(Col,Line,&FlagTmp,IsFor_Left_Top_Out); 
                    
 
 
				  //Debug End 
                  if(IsDrawing) 
				  if(FlagTmp)    
                   this->DrawBorder(); 
				  // Col=pInput->left; 
				   //	Line=pInput->top; 
					 
				   Col--; 
				   //return TRUE; 
 
				} 
			} 
	   if(!Flag) break; 
	} 
 
//	return GetAcreagePointNum(); 
	return ObjectNum; 
 
} 
int Image_Identify::GetAcreagePointNum(void) 
{ 
	CDesignView *pDesignView; 
	CDesignDoc *pDoc; 
	CMainFrame* pMFrame=(CMainFrame*)(AfxGetApp()->m_pMainWnd); 
    pDesignView=(CDesignView*)pMFrame->GetActiveView(); 
	pDoc=pDesignView->GetDocument(); 
	 CClientDC CcDc(pDesignView); 
	int PointNum_=0; 
	int line;//col; 
	int Start,End; 
    RECT TheRect; 
    Get_Left_Top_And_Right_Bottom(TheRect); 
    pDesignView->pPara_Detect->DrawRect(&CcDc,TheRect,RGB(128,128,128)); 
     
	for(line=TheRect.top;line<=TheRect.bottom;line++) 
	{ 
	  //for(col=TheRect.left;col<=TheRect.right;col++)   
	 GetLineColRange(Start,End,line); 
     PointNum_+=End-Start+1; 
	} 
 
 
return PointNum_; 
} 
 
void Image_Identify::Get_Left_Top_And_Right_Bottom(RECT &L_T_AND_R_B) 
{  
	 int i=0; 
     POINT *pPoint=(POINT*)pBorderPositionBuffer; 
	 L_T_AND_R_B.left=L_T_AND_R_B.right=pPoint[i].x; 
	 L_T_AND_R_B.top=L_T_AND_R_B.bottom=pPoint[i].y; 
	 for(i=0;ipPoint[i].x) 
	      L_T_AND_R_B.left=pPoint[i].x; 
       if(L_T_AND_R_B.top>pPoint[i].y) 
          L_T_AND_R_B.top=pPoint[i].y; 
       if(L_T_AND_R_B.rightpPoint 
		   Start=pPoint[i].x; 
		   End=pPoint[i].x; 
		   break; 
	   } 
	 } 
      
	 for(;ipPoint[i].x) 
		      Start=pPoint[i].x; 
            if(End