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

📄 imagepview.cpp

📁 用于图像处理方面的visual c++的image
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	brBrush.CreatePatternBrush(&pBitmap);
	pDC->SelectObject(&brBrush);
	pDC->Rectangle(x,y,x+400,y+100);
	brBrush.DeleteObject();
}

void CImagePView::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],lstrlen(textbuf[i]));
	}
}

void CImagePView::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 CImagePView::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 CImagePView::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 CImagePView::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 CImagePView::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 CImagePView::On256colorImageExam() 
{
 	int	    i,j;
  
 	SaveCanvus.Create(512,512,8,0);                         
	SetDefaultPalette(&SaveCanvus);                         

	for (i=0;i<256;i++)
		for (j=0;j<256;j++)	
			SetPixelValue(&SaveCanvus,j,i,j);

	for (i=0;i<256;i++)     
		for (j=0;j<256;j++)	
			SetPixelValue(&SaveCanvus,256+j,i,j/16);

	for (i=0;i<256;i++)     
		for (j=0;j<256;j++)	
			SetPixelValue(&SaveCanvus,j,256+i,(i/16)*16);

	RectFillValue(&SaveCanvus,255,255,257,257,7);
	for (i=0;i<16;i++)
		for (j=0;j<16;j++)
			RectFillValue(&SaveCanvus,256+j*16,256+i*16,15,15,i*16+j);    
  
 	ImageCopy(pImg[1],pImg[0]);                                  
	m_FileName = "256 色模式图像实例";
   	Invalidate();
}

void CImagePView::OnTrueColorImageExam() 
{
 	int		i,j,nBytesPerPixel;
	BYTE	buff[2048];
 
 	SaveCanvus.Create(512,512,24,0);                        
 
    nBytesPerPixel = SaveCanvus.GetBPP()/8;
	for (i=0;i<256;i++) {
		for (j=0;j<3;j++) buff[i*nBytesPerPixel+j]=(BYTE) i;    
	}
	for (i=0;i<256;i++)   
		SetRectValue(&SaveCanvus,0,0+i,256,1,buff);         

	for (i=0;i<256*nBytesPerPixel;i++) buff[i]=0;
	for (i=0;i<256;i++) buff[i*nBytesPerPixel]=(BYTE) i;        
	for (i=0;i<256;i++)                  	
		SetRectValue(&SaveCanvus,256,i,256,1,buff);	     
   
	for (i=0;i<256*nBytesPerPixel;i++) buff[i]=0;      
	for (i=0;i<256;i++) buff[i*nBytesPerPixel+1]=(BYTE) i;      
	for (i=0;i<256;i++)                  	
		SetRectValue(&SaveCanvus,0,256+i,256,1,buff);	     
   
	for (i=0;i<256*nBytesPerPixel;i++) buff[i]=0;
	for (i=0;i<256;i++) buff[i*nBytesPerPixel+2]=(BYTE) i;      
	for (i=0;i<256;i++)                  	
		SetRectValue(&SaveCanvus,256,256+i,256,1,buff);	     

	ImageCopy(pImg[1],pImg[0]);                                  
	m_FileName = "真彩色模式图像实例";
	Invalidate();
}

void CImagePView::WorkCanvusToWindow()         
{
	CClientDC	dc(this);
	struct IMAGEPARAMENT P;	
 
	if (SaveCanvus.IsNull()) return;

	GetImageParament(&WorkCanvus,&P);
 	WorkCanvus.BitBlt(dc,0,0,P.nWidth,P.nHeight,0,0,SRCCOPY);
}

void CImagePView::OnRefresh() 
{
	if (SaveCanvus.IsNull()) return;
	OnClearWindow();                             
 	if (ImageType(pImg[0])<2) 
 		LowTypeToIndex(pImg[1],pImg[0]);
 	else
		ImageCopy(pImg[1],pImg[0]);
 	WriteTitle(pImg[1],m_FileName,"");           
   	WorkCanvusToWindow();                      
	m_nFlag=0;
	m_nSize=1;
}

void CImagePView::WriteTitle(CImage* pImg,CString FileName,CString str0)  //  显示带图像文件名与分辨率的标题行
{
	int		i,k;
	CString	str, str1;
 	struct	IMAGEPARAMENT P;
	char drive[_MAX_DRIVE];   
	char dir[_MAX_DIR];
	char fname[_MAX_FNAME];   
	char ext[_MAX_EXT];
 
	_splitpath(FileName, drive, dir, fname, ext);   
 
 	CWnd*	pMain = AfxGetMainWnd();
	CMenu*	pMenu = pMain->GetMenu();

	k=ImageType(pImg);                                 
	for (i=0;i<5;i++)
		pMenu->CheckMenuItem(ID_BINARY_IMAGE+i,MF_UNCHECKED);
	pMenu->CheckMenuItem(ID_BINARY_IMAGE+k,MF_CHECKED);   
 
	GetImageParament(pImg,&P);
	if (k==0) P.nBitCount=1;
	else if (k==1) P.nBitCount=4;
	str1.Format(" (%d×%d×%d)", P.nWidth, P.nHeight, P.nBitCount);  
	str.LoadString(AFX_IDS_APP_TITLE);             
 	AfxGetMainWnd()->SetWindowText(str+" - "+ 
		              fname + ext + str0 +str1);   
}

void CImagePView::OnGrayPalette()        
{
 	Invalidate();
	for (int i=0;i<256;i++) 
		SetPalette(&WorkCanvus,i,i,i,i);
	WorkCanvusToWindow();
}

void CImagePView::OnBluePalette()       
{
 	Invalidate();
	for (int i=0;i<256;i++) 
		SetPalette(&WorkCanvus,i,0,0,i);
 	WorkCanvusToWindow();
}

void CImagePView::OnRestorePalette()
{
 	int			nNumColors; 
	RGBQUAD		ColorTab[256];
 
	Invalidate();
	nNumColors=SaveCanvus.GetMaxColorTableEntries();
 	SaveCanvus.GetColorTable(0,nNumColors,ColorTab);
	WorkCanvus.SetColorTable(0,nNumColors,ColorTab);
	WorkCanvusToWindow();
}

void CImagePView::OnMovPalette()         
{
	OnRefresh();
 	SetTimer(ID_CLOCK_TIMER,100,NULL);               
	ShowCursor(FALSE);                               
	m_nFlag=ID_MOV_PALETTE;
}

void CImagePView::OnImagePalette()         
{
	RGBQUAD	ColorTab[256];
	int		nWidth,nNumColors;

	OnRefresh();
	nWidth =SaveCanvus.GetWidth();
	nNumColors=SaveCanvus.GetMaxColorTableEntries();
 	SaveCanvus.GetColorTable(0,nNumColors,ColorTab);
  	DisplayPalette(ColorTab,nNumColors,nWidth+20,20,10,10);
}

void CImagePView::OnPasteRefresh()
{
	WorkCanvusToWindow();
	m_nFlag=0;
}

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

void CImagePView::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 CImagePView::ClearWorkCanvus(void)        
{
	struct  IMAGEPARAMENT P;
 	BYTE	*buf;
  
	GetImageParament(&WorkCanvus,&P);
   	buf = (BYTE*) WorkCanvus.GetPixelAddress(0,P.nHeight-1);    
	memset(buf,255,P.nSize);                       
 }

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

void CImagePView::OnClearWindow()
{
	CClientDC dc(this);
 
 	dc.SelectStockObject(WHITE_PEN);
	dc.SelectStockObject(WHITE_BRUSH);
	dc.Rectangle(0,0,1023,639);
}

void CImagePView::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;
		}
		WorkCanvusToWindow();
	}
	CWnd::OnTimer(nIDEvent);
}

void CImagePView::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 CImagePView::OnColorToGray()                   
{
	CString	str1;
 
	if (ImageType(pImg[0])==2) return;

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

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

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

void CImagePView::OnFlipHorizon()                 
{
  	Flip(pImg[1],1);
	WorkCanvusToWindow();                      
}

void CImagePView::OnFlipVert()                    
{
  	Flip(pImg[1],2);
	WorkCanvusToWindow();                      
}

void CImagePView::OnRotate180()                   
{
  	Flip(pImg[1],3);
	WorkCanvusToWindow();                      
}

void CImagePView::OnRotate270()                   
{
	ImageCopy(pImg[2],pImg[1]);
	Rotate90(pImg[1],pImg[2],1);
	OnClearWindow();                               
	WorkCanvusToWindow();                      
}

void CImagePView::OnRotate90()                    
{
	ImageCopy(pImg[2],pImg[1]);
	Rotate90(pImg[1],pImg[2],2);
	OnClearWindow();                               
	WorkCanvusToWindow();                      
}

void CImagePView::OnImageMasaic()
{

⌨️ 快捷键说明

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