⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iprocesspview.cpp

📁 VC++ using in image processing
💻 CPP
📖 第 1 页 / 共 3 页
字号:

void CIProcessPView::OnPasteRefresh()
{
	WorkCanvusToWindow();
}

void CIProcessPView::OnConservationImage()
{
	ImageCopy(pImg[0],pImg[1]);
}

void CIProcessPView::OnCloseImage()
{
 	CString		str;
	CWnd*		pMain = AfxGetMainWnd();
	CMenu*		pMenu = pMain->GetMenu();

	str.LoadString(AFX_IDS_APP_TITLE);  
	AfxGetMainWnd()->SetWindowText(str);

	for (int i=0;i<5;i++)
		pMenu->CheckMenuItem(ID_BINARY_IMAGE+i,MF_UNCHECKED);

	SaveCanvus.Destroy();
	WorkCanvus.Destroy();
	OnSelectWindow();
 	OnClearWindow();
}

void CIProcessPView::ClearWorkCanvus(void)        
{
	struct  IMAGEPARAMENT P;
 	BYTE	*buf;
  
	GetImageParament(&WorkCanvus,&P);
   	buf = (BYTE*) WorkCanvus.GetPixelAddress(0,P.nHeight-1);    
	memset(buf,255,P.nSize);                       
 }

void CIProcessPView::OnDrawRefresh()
{
	Invalidate();
}

void CIProcessPView::OnClearWindow()
{

	CClientDC dc(this);
 
 	dc.SelectStockObject(WHITE_PEN);
	dc.SelectStockObject(WHITE_BRUSH);
	dc.Rectangle(0,0,1023,639);
}

void CIProcessPView::OnSelectWindow()
{
	int		i;
 	CWnd*	pMain = AfxGetMainWnd();
	CMenu*	pMenu = pMain->GetMenu();
 
	m_nGraphicFlag=0;
	for (i=0;i<2;i++)
		pMenu->CheckMenuItem(ID_SELECT_WINDOW+i,MF_UNCHECKED);
	pMenu->CheckMenuItem(ID_SELECT_WINDOW+m_nGraphicFlag,MF_CHECKED);
}

void CIProcessPView::OnSelectImage()
{
	int		i;
 	CWnd*	pMain = AfxGetMainWnd();
	CMenu*	pMenu = pMain->GetMenu();

 	m_nGraphicFlag=1;
	for (i=0;i<2;i++)
		pMenu->CheckMenuItem(ID_SELECT_WINDOW+i,MF_UNCHECKED);
	pMenu->CheckMenuItem(ID_SELECT_WINDOW+m_nGraphicFlag,MF_CHECKED);
}

void DrawPixelOnCanvus(CDC *pDC,int x1,int y1)
{
 	for(int y=y1;y<130+y1;y++)
		for(int x=x1;x<1022;x++)
			pDC->SetPixel(x,y,(COLORREF)x*y);
}

void CIProcessPView::OnDrawPixel()
{
	m_nFlag=0;
	if (m_nGraphicFlag==0) {
  		CWnd*	pMain = AfxGetMainWnd();
 		CDC*	pDC = pMain->GetDC();
		DrawPixelOnCanvus(pDC,2,26);
 		pMain->ReleaseDC(pDC);
	}
	else {
		CDC	*pWorkImgDC= CDC::FromHandle(WorkCanvus.GetDC());
		DrawPixelOnCanvus(pWorkImgDC,0,0);
		WorkCanvus.ReleaseDC();

		WorkCanvusToWindow();
	}
}

void DrawLineOnCanvus(CDC *pDC,int x,int y)
{
	COLORREF  rgbPen=RGB(0,255,0);
	CPen	  penGreen(PS_SOLID,2,rgbPen),
              penBlack(PS_SOLID,2,RGB(0,255,255)),
			  *pOldPen=NULL;
  	int       i,j,n;

	n=400;

 	pOldPen=pDC->SelectObject(&penGreen);
	pDC->MoveTo(x,y);
	for (i=0;i<n;i++) {
		j=(int) (50.0*(n-3*i/4)/n*sin(PI*i/(n/15)));
		pDC->LineTo(x+i,y-j);
	}

 	pDC->SelectObject(&penBlack);
	pDC->MoveTo(x-20,y);
	pDC->LineTo(x+n+20,y);

 	pDC->SelectObject(pOldPen);

	penGreen.DeleteObject();
	penBlack.DeleteObject();
}

void CIProcessPView::OnDrawLine()
{
	m_nFlag=0;
	if (m_nGraphicFlag==0) {
  		CWnd*	pMain = AfxGetMainWnd();
 		CDC*	pDC = pMain->GetDC();
		DrawLineOnCanvus(pDC,2+56,26+65);
 		pMain->ReleaseDC(pDC);
	}
	else {
		CDC	*pWorkImgDC= CDC::FromHandle(WorkCanvus.GetDC());
		DrawLineOnCanvus(pWorkImgDC,56,65);
		WorkCanvus.ReleaseDC();

		WorkCanvusToWindow();
	}
}

void DrawGraphFillOnCanvus(CDC *pDC,int x1,int y1)
{
	int		x,y;
 
	x=35+x1;		y=130+y1;
 
	pDC->SelectStockObject(BLACK_PEN);
	pDC->SelectStockObject(HOLLOW_BRUSH);
 
	pDC->Rectangle(x,y+50,x+50,y+100);
	pDC->RoundRect(x,y+150,x+50,y+200,15,15);
	pDC->Ellipse(x+75,y+50,x+125,y+100);
	pDC->Chord(x+75,y+150,x+125,y+200,x+75,y+150,x+125,y+200);
	pDC->Pie(x+150,y+50,x+200,y+100,x+150,y+50,x+200,y+50);

	x=280+x1;
	pDC->SelectStockObject(DKGRAY_BRUSH);
 
	pDC->Rectangle(x,y+50,x+50,y+100);
	pDC->RoundRect(x,y+150,x+50,y+200,15,15);
	pDC->Ellipse(x+75,y+50,x+125,y+100);
	pDC->Chord(x+75,y+150,x+125,y+200,x+75,y+150,x+125,y+200);
	pDC->Pie(x+150,y+50,x+200,y+100,x+150,y+50,x+200,y+50);
}

void CIProcessPView::OnGraphFill()
{
	m_nFlag=0;
	if (m_nGraphicFlag==0) {
  		CWnd*	pMain = AfxGetMainWnd();
 		CDC*	pDC = pMain->GetDC();
		DrawGraphFillOnCanvus(pDC,2,26);
 		pMain->ReleaseDC(pDC);
	}
	else {
		CDC	*pWorkImgDC= CDC::FromHandle(WorkCanvus.GetDC());
		DrawGraphFillOnCanvus(pWorkImgDC,0,0);
		WorkCanvus.ReleaseDC();

		WorkCanvusToWindow();
	}
}

void DrawHatchFillOnCanvus(CDC *pDC,int x,int y)
{
	CBrush brBrush[6];
	int	   i,k;
  
	pDC->SetBkMode(OPAQUE);
	pDC->SelectStockObject(BLACK_PEN);
 	brBrush[0].CreateHatchBrush(HS_HORIZONTAL,RGB(0,0,0));
	brBrush[1].CreateHatchBrush(HS_VERTICAL,RGB(255,0,0));
	brBrush[2].CreateHatchBrush(HS_CROSS,RGB(255,0,255));
	brBrush[3].CreateHatchBrush(HS_FDIAGONAL,RGB(0,255,0));
	brBrush[4].CreateHatchBrush(HS_BDIAGONAL,RGB(0,0,255));
	brBrush[5].CreateHatchBrush(HS_DIAGCROSS,RGB(0,255,255));

	k=75;
	for (i=0;i<6;i++) {
		pDC->SelectObject(&brBrush[i]);
		pDC->Rectangle(x+k*i+10,y+10,x+k*(i+1),y+200);
		brBrush[0].DeleteObject();
	}
}

void CIProcessPView::OnHatchFill()
{
	m_nFlag=0;
	if (m_nGraphicFlag==0) {
  		CWnd*	pMain = AfxGetMainWnd();
 		CDC*	pDC = pMain->GetDC();
		DrawHatchFillOnCanvus(pDC,550,175);
 		pMain->ReleaseDC(pDC);
	}
	else {
		CDC	*pWorkImgDC= CDC::FromHandle(WorkCanvus.GetDC());
		DrawHatchFillOnCanvus(pWorkImgDC,25,70);
		WorkCanvus.ReleaseDC();

		WorkCanvusToWindow();
	}
}

void DrawPatternFillOnCanvus(CDC *pDC,int x,int y)
{
	CBrush	brBrush;
	CBitmap	pBitmap;
	short   lpBits[8]={0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa};
  
   	pBitmap.CreateBitmap(8,8,1,1,lpBits);
	brBrush.CreatePatternBrush(&pBitmap);
	pDC->SelectObject(&brBrush);
	pDC->Rectangle(x,y,x+400,y+100);
	brBrush.DeleteObject();
}

void CIProcessPView::OnPatternFill()
{
	m_nFlag=0;
	if (m_nGraphicFlag==0) {
  		CWnd*	pMain = AfxGetMainWnd();
 		CDC*	pDC = pMain->GetDC();
		DrawPatternFillOnCanvus(pDC,56,400);
 		pMain->ReleaseDC(pDC);
	}
	else {
		CDC	*pWorkImgDC= CDC::FromHandle(WorkCanvus.GetDC());
		DrawPatternFillOnCanvus(pWorkImgDC,56,120);
		WorkCanvus.ReleaseDC();

		WorkCanvusToWindow();
	}
}

void DrawTextOnCanvus(CDC *pDC,int x,int y)
{
	int			i,nYChar;
	TEXTMETRIC	tm;
	char		*textbuf[]={"Windows C 图像处理演示程序",
	                        "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
	                        "abcdefghijklmnopqrstuvwxyz",
				  		    "1234567890",
						    "Windows 图形编程"};
 
	pDC->SetBkMode(TRANSPARENT);
	pDC->GetTextMetrics(&tm);
	nYChar=tm.tmHeight+tm.tmExternalLeading;
	for (i=0;i<5;i++) {
		pDC->TextOut(x,y+nYChar*i,textbuf[i]);
	}
}

void CIProcessPView::OnDrawText()
{
	m_nFlag=0;
	if (m_nGraphicFlag==0) {
  		CWnd*	pMain = AfxGetMainWnd();
 		CDC*	pDC = pMain->GetDC();
		DrawTextOnCanvus(pDC,2+90,26+520);
 		pMain->ReleaseDC(pDC);
	}
	else {
		CDC	*pWorkImgDC= CDC::FromHandle(WorkCanvus.GetDC());
		DrawTextOnCanvus(pWorkImgDC,90,370);
		WorkCanvus.ReleaseDC();

		WorkCanvusToWindow();
	}
}

void DrawRandCircleOnCanvus(CDC *pDC,int xx,int yy)
{
	CPen	penPen, *pOldPen=NULL;
	CRect	Rect;
	int		x,y,r,x1,y1,x2,y2;
	int		cr,cg,cb,i,nWidth,nHeight;
 
	pDC->GetClipBox(&Rect);
	nWidth=Rect.Width()-2*xx;
	nHeight=Rect.Height()-2*yy;
  
 	for (i=0;i<75;i++)	{
		x=rand()%(nWidth);
		y=rand()%(nHeight);
		r=rand()%((nWidth+nHeight)/25);
		if (x<r)     x+=r;
		if (x>nWidth-r) x-=r;
		if (y<r)     y+=r;
		if (y>nHeight-r) y-=r;
		cr=rand()%256;			cg=rand()%256;
		cb=rand()%256;
 
		x+=xx;
		y+=yy;
		x1=x-r;			y1=y-r;
		x2=x+r;			y2=y+r;
		penPen.CreatePen(PS_SOLID,1,RGB(cr,cg,cb));
		pOldPen = pDC->SelectObject(&penPen);
		pDC->Arc(x1,y1,x2,y2,x1,0,x1,0);
		pDC->SelectObject(pOldPen);
		penPen.DeleteObject();
	}
}

void CIProcessPView::OnRandCircle()
{
	m_nFlag=0;
	if (m_nGraphicFlag==0) {
  		CWnd*	pMain = AfxGetMainWnd();
 		CDC*	pDC = pMain->GetDC();
		DrawRandCircleOnCanvus(pDC,2,26);
 		pMain->ReleaseDC(pDC);
	}
	else {
		CDC	*pWorkImgDC= CDC::FromHandle(WorkCanvus.GetDC());
		DrawRandCircleOnCanvus(pWorkImgDC,0,0);
		WorkCanvus.ReleaseDC();

		WorkCanvusToWindow();
	}
}

void CopyBitmapOnCanvus(CDC *pDC,int xx,int yy)
{
	CRect	Rect;
	int		Dx,Dy;
 
	pDC->GetClipBox(&Rect);
	Dx=Rect.Width();
	Dy=Rect.Height();

	pDC->SelectStockObject(BLACK_PEN);
	pDC->SelectStockObject(HOLLOW_BRUSH);

	if (SaveCanvus.IsNull()) {
 		pDC->BitBlt(xx+Dx/2,yy+Dy-Dy/3,
				Dx/2,Dy/4,pDC,xx,yy,SRCCOPY);
		pDC->Rectangle(xx,yy,xx+Dx/2,yy+Dy/4);
	}
	else {
 		CDC	*pOrigDC= CDC::FromHandle(SaveCanvus.GetDC());
 		pDC->BitBlt(xx+Dx/2,yy+2*Dy/3,
				Dx/2,Dy/4,pOrigDC,0,0,SRCCOPY);
 		SaveCanvus.ReleaseDC();
	}
	pDC->Rectangle(xx+Dx/2,yy+2*Dy/3,xx+Dx,yy+Dy-Dy/12);
}

void CIProcessPView::OnCopyBitmap()
{
	m_nFlag=0;
	if (m_nGraphicFlag==0) {
  		CWnd*	pMain = AfxGetMainWnd();
 		CDC*	pDC = pMain->GetDC();
		CopyBitmapOnCanvus(pDC,2,26);
 		pMain->ReleaseDC(pDC);
	}
	else {
 		CDC	*pWorkImgDC= CDC::FromHandle(WorkCanvus.GetDC());
		CopyBitmapOnCanvus(pWorkImgDC,0,0);
		WorkCanvus.ReleaseDC();

		WorkCanvusToWindow();
	}
}

void CIProcessPView::OnTimer(UINT nIDEvent)             
{
	if (m_nFlag==ID_MOV_PALETTE) 
	{
  		struct IMAGEPARAMENT P;
		static RGBQUAD ColorTab;
		CClientDC   dc(this);
		static int	i=0;
 
		GetImageParament(&WorkCanvus,&P);
		if (i>0) {
 			WorkCanvus.SetColorTable(i-1,1,&ColorTab);         
		}
		if (i<P.nNumColors) {
			WorkCanvus.GetColorTable(i,1,&ColorTab);           
 			SetPalette(&WorkCanvus,i,255,0,0);                  
 		}
		i++;
		if (i==P.nNumColors+1) {                             
			KillTimer(ID_CLOCK_TIMER);                   
 			ShowCursor(TRUE);                            
			i=0;
		}
		WorkCanvus.BitBlt(dc,0,0,P.nWidth,P.nHeight,0,0,SRCCOPY);
	}
	CWnd::OnTimer(nIDEvent);
}

void CIProcessPView::OnImageParament()
{
	CClientDC	dc(this);
 	int			i,x,y,k,nYChar;
	CString		str;
 	TEXTMETRIC	tm;
	char		*textbuf[]={"像素行的存储顺序","图像宽度","图像高度",
				    	    "每像素位数","每行字节数"    };

    m_nFlag=0;
	OnRefresh();
 
	x=625;		     y=120;

 	dc.SelectStockObject(WHITE_PEN);
	dc.SelectStockObject(WHITE_BRUSH);
	dc.Rectangle(600,0,1023,624);

	dc.SetBkMode(TRANSPARENT);
	dc.GetTextMetrics(&tm);
	dc.SetTextColor(RGB(0,0,0));
  	nYChar=(tm.tmHeight+tm.tmExternalLeading)*3/2;
 	dc.TextOut(x+60,y-nYChar*3/2,"图像特征参数");

	for (i=0;i<5;i++) {
		dc.TextOut(x,y+nYChar*i,textbuf[i]);
	}

	x += 175;
	k = SaveCanvus.GetPitch();
	if (k<0)
 		dc.TextOut(x,y+nYChar*0,"自下而上");
   	else
 		dc.TextOut(x,y+nYChar*0,"自上而下");
   	str.Format("%d  ",abs(k));
	dc.TextOut(x,y+nYChar*4,str);

 	str.Format("%d  ",SaveCanvus.GetWidth());
	dc.TextOut(x,y+nYChar*1,str);
 	str.Format("%d  ",SaveCanvus.GetHeight());
	dc.TextOut(x,y+nYChar*2,str);
 	str.Format("%d  ",SaveCanvus.GetBPP());
	dc.TextOut(x,y+nYChar*3,str);

	if (SaveCanvus.GetMaxColorTableEntries()) {
 		dc.TextOut(x-175,y+nYChar*6,"使用色彩数");
		k=SaveCanvus.GetMaxColorTableEntries();
		str.Format("%d  ",k);
		dc.TextOut(x,y+nYChar*6,str);
  	}
	else
		dc.TextOut(x-175,y+nYChar*6,"真彩色图像,无调色板");

	if (SaveCanvus.IsTransparencySupported()) {
 		dc.TextOut(x-175,y+nYChar*8,"调色板中透明色位置");
		k=SaveCanvus.GetTransparentColor();
 		str.Format("%d  ",k);
		dc.TextOut(x,y+nYChar*8,str);
	}
	else
		dc.TextOut(x-175,y+nYChar*8,"不支持透明位图");
}

//------------------------------------------------------------------------------------------

void CIProcessPView::OnGrayImage()                   
{
	CString	str1;
 
	if (ImageType(pImg[0])==2) return;

	ColorToGray(pImg[1],pImg[1]);               
	str1.Format(" 的灰阶图像"); 
	WriteTitle(pImg[1],m_FileName,str1);                 
   	WorkCanvusToWindow();                      
	m_nSize=1;
}

void CIProcessPView::OnImageInvert()     
{
	ImageInvert(pImg[1]);
	WorkCanvusToWindow();                      
}

void CIProcessPView::OnColorToMonochrom()           
{
	ColorToMonochrom(pImg[1]);
 	WorkCanvusToWindow();                      
}

void CIProcessPView::FlipCV(int n)             
{
  	Flip(pImg[1],n);
	WorkCanvusToWindow();                      
}

void CIProcessPView::OnFlipHorizon()                 
{
 	FlipCV(1);
}

void CIProcessPView::OnFlipVert()                    
{
 	FlipCV(2);
}

void CIProcessPView::OnRotate180()                   
{
 	FlipCV(3);
}

void CIProcessPView::Rotate90CV(int n)                 
{
	ImageCopy(pImg[2],pImg[1]);
	Rotate90(pImg[1],pImg[2],n);
	OnClearWindow();                               
	WorkCanvusToWindow();                      
}

void CIProcessPView::OnRotate270()                   
{
	Rotate90CV(1);
}

void CIProcessPView::OnRotate90()                    
{
	Rotate90CV(2);
}

void CIProcessPView::OnImageMasaic()
{
 	ImageMasaic(pImg[1],4);
 	OnClearWindow();                               
	WorkCanvusToWindow();                        
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -