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

📄 conversionview.cpp

📁 图象像素的表示
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		}
		else
		{
			top=selRect.top ;
			bottom=selRect.bottom ;
		}

		selRect.left =left;
		selRect.top=top;
		selRect.bottom =bottom;
		selRect.right =right;

		//释放鼠标指针和光标
		//
		ReleaseCapture();
		ClipCursor(NULL);
		bSelect=FALSE;
	}
	
	CView::OnLButtonUp(nFlags, point);
}

////////////////////////////////////////////////////////////
//鼠标移动消息函数:拖动鼠标绘制处理区域。
//
void CConversionView::OnMouseMove(UINT nFlags, CPoint point) 
{
	if(bSelect)
	{
		//擦除旧的矩形框
		//
		if(selRect.right !=-1)
		{
			DrawRect(selRect);
		}

		selRect.right =point.x;
		selRect.bottom =point.y;
		DrawRect(selRect);
	}

	CView::OnMouseMove(nFlags, point);
}

//////////////////////////////////////////
//画矩形函数:通过画边线实现擦除旧矩形、绘
//制新矩形的动态过程。
//
void CConversionView::DrawRect(RECT Rect)
{
	CPen *OldPen,NewPen;
	
	m_pDC->SetROP2 (R2_NOT);
	NewPen.CreatePen (PS_DASH,1,RGB(255,0,0));
	OldPen=m_pDC->SelectObject (&NewPen);

	m_pDC->MoveTo (Rect.left ,Rect.top );
	m_pDC->LineTo (Rect.right ,Rect.top );
	m_pDC->LineTo (Rect.right ,Rect.bottom );
	m_pDC->LineTo (Rect.left ,Rect.bottom );
	m_pDC->LineTo (Rect.left ,Rect.top );

	m_pDC->SelectObject (OldPen);
	NewPen.DeleteObject ();
}

void CConversionView::OnDestroy() 
{
	CView::OnDestroy();
	
	// 释放资源
	//
	if(m_pDC)
		delete m_pDC;
	if(pFrameBuff)
		delete pFrameBuff;
	if(pBuff)
		delete pBuff;
}

/////////////////////////////////////////////////
//马赛克处理函数:在指定区域内,按给定参数值,依据
//相应的算法实现图像的处理。
//
void CConversionView::Mosaic(RECT rSel,int Value)
{
	int ix,iy;
	DWORD sIndex;
	UINT wUpper,hUpper;
	
	int x,y;
	int xc,yc;
	int block;
	int deltax,deltay;

	int clrR,clrG,clrB;
	int clrRs,clrGs,clrBs;
	COLORREF clrMosaic,clrTemp;

	m_pDC->SetROP2 (R2_COPYPEN);
	wUpper=biWidth<rSel.right+1 ?biWidth:rSel.right+1 ;
	hUpper=biHeight<rSel.bottom+1 ?biHeight:rSel.bottom+1 ;
	
	//求出模板内象素颜色平均值,并用该值填充模板区域
	//
	for(iy=rSel.top ;iy<hUpper;)
	{
		for(ix=rSel.left ;ix<wUpper;)
		{
			deltax=wUpper-ix;
			deltay=hUpper-iy;
			deltax=deltax>Value?Value+1:deltax;
			deltay=deltay>Value?Value+1:deltay;

            clrRs=0;
			clrGs=0;
			clrBs=0;
			for(yc=iy;yc<=iy+deltay;yc++)
			{
				sIndex=yc*biWidth;
				for(xc=ix;xc<=ix+deltax;xc++)
				{
					clrTemp=pBuff[sIndex+xc].clrRGBA ;
					clrR=clrTemp&0x000000ff;
					clrTemp=clrTemp>>8;
					clrG=clrTemp&0x000000ff;
					clrTemp=clrTemp>>8;
					clrB=clrTemp&0x000000ff;

					clrRs+=clrR;
					clrGs+=clrG;
					clrBs+=clrB;
				}
			}

			block=(deltax+1)*(deltay+1);
			clrRs/=block;
			clrGs/=block;
			clrBs/=block;
			clrMosaic=RGB(clrRs,clrGs,clrBs);

			for(y=iy;y<=iy+deltay;y++)
				for(x=ix;x<=ix+deltax;x++)
				{
					m_pDC->SetPixel (x,y,clrMosaic);
					sIndex=y*biWidth+x;
					pFrameBuff[sIndex].clrRGBA =clrMosaic;
				}
			ix+=deltax+1;
		}
		iy+=deltay+1;
	}
}

/////////////////////////////////////////////////
//柔化处理函数:在指定区域内,按给定参数值,依据
//相应的算法实现图像的处理。
//
void CConversionView::Blur(RECT rSel,int Value)
{
	int block;
	int xc,yc;
	int xL,xR,yU,yD;
	
	int ix,iy;
	DWORD sIndex;	
    UINT wUpper,hUpper;

	int clrR,clrG,clrB;
	int clrRs,clrGs,clrBs;
	COLORREF clrBlur,clrTemp;

	m_pDC->SetROP2 (R2_COPYPEN);
	wUpper=biWidth<rSel.right+1 ?biWidth:rSel.right+1 ;
	hUpper=biHeight<rSel.bottom +1?biHeight:rSel.bottom+1 ;
	
    //求出模板内象素颜色平均值,并用该值设置当前象素
	//
	for(iy=rSel.top ;iy<hUpper;iy++)
	{
		for(ix=rSel.left ;ix<wUpper;ix++)
		{
			xL=ix-rSel.left;
			xL=xL>Value?Value:xL;
            
			xR=wUpper-ix;
			xR=xR>Value+1?Value+1:xR;

			yU=iy-rSel.top;
			yU=yU>Value?Value:yU;
            
			yD=hUpper-iy;
			yD=yD>Value+1?Value+1:yD;
			
			clrRs=0;
			clrGs=0;
			clrBs=0;
			block=0;

			for(yc=iy-yU;yc<=iy+yD;yc++)
			{
				sIndex=yc*biWidth;
				for(xc=ix-xL;xc<=ix+xR;xc++)
				{
					clrTemp=pBuff[sIndex+xc].clrRGBA ;
					clrR=clrTemp&0x000000ff;
					clrTemp=clrTemp>>8;
					clrG=clrTemp&0x000000ff;
					clrTemp=clrTemp>>8;
					clrB=clrTemp&0x000000ff;

					clrRs+=clrR;
					clrGs+=clrG;
					clrBs+=clrB;

					block++;
				}
			}

			clrRs/=block;
			clrGs/=block;
			clrBs/=block;
			clrBlur=RGB(clrRs,clrGs,clrBs);
			
			m_pDC->SetPixel (ix,iy,clrBlur);
			sIndex=iy*biWidth+ix;
			pFrameBuff[sIndex].clrRGBA =clrBlur;
		}
	}
			
}

/////////////////////////////////////////////////
//单色化处理函数:在指定区域内,按给定参数值,依据
//相应的算法实现图像的处理。
//
void CConversionView::Gray(RECT rSel,int Value)
{
	int ix,iy;
	DWORD sIndex;
	UINT wUpper,hUpper;

	int clrR,clrG,clrB;
	int clrRs,clrGs,clrBs;
	COLORREF clrGray,clrTemp;

	m_pDC->SetROP2 (R2_COPYPEN);
	wUpper=biWidth<rSel.right+1 ?biWidth:rSel.right+1 ;
	hUpper=biHeight<rSel.bottom+1 ?biHeight:rSel.bottom +1;
	
	//当前象素颜色各色分量平均值,并用该值作为三色分量
	//形成新颜色值,以此设置当前象素
	//
	for(iy=rSel.top ;iy<hUpper;iy++)
	{
		sIndex=iy*biWidth;
		for(ix=rSel.left ;ix<wUpper;ix++)
		{
			clrRs=0;
			clrGs=0;
			clrBs=0;

			clrTemp=pBuff[sIndex+ix].clrRGBA ;
			clrR=clrTemp&0x000000ff;
			clrTemp=clrTemp>>8;
			clrG=clrTemp&0x000000ff;
			clrTemp=clrTemp>>8;
			clrB=clrTemp&0x000000ff;
			
			clrB=0.20*clrB;
			clrR=0.35*clrR;
			clrG=0.45*clrG;
			clrB=clrR+clrG+clrB;
			
			clrGray=RGB(clrB,clrB,clrB);
			m_pDC->SetPixel (ix,iy,clrGray);

			pFrameBuff[sIndex+ix].clrRGBA =clrGray;
		}
	}
}

/////////////////////////////////////////////////
//二值化处理函数:在指定区域内,按给定参数值,依据
//相应的算法实现图像的处理。
//
void CConversionView::WhtBlk(RECT rSel,int Value)
{
	int ix,iy;
	DWORD sIndex;
	UINT wUpper,hUpper;

	int clrR,clrG,clrB;
	int clrRs,clrGs,clrBs;
	COLORREF clrWhtBlk,clrTemp;

	m_pDC->SetROP2 (R2_COPYPEN);
	wUpper=biWidth<rSel.right+1 ?biWidth:rSel.right+1 ;
	hUpper=biHeight<rSel.bottom+1 ?biHeight:rSel.bottom+1 ;
	
	//先单色化
	//
	for(iy=rSel.top ;iy<hUpper;iy++)
	{
		sIndex=iy*biWidth;
		for(ix=rSel.left ;ix<wUpper;ix++)
		{
			clrRs=0;
			clrGs=0;
			clrBs=0;

			clrTemp=pBuff[sIndex+ix].clrRGBA ;
			clrR=clrTemp&0x000000ff;
			clrTemp=clrTemp>>8;
			clrG=clrTemp&0x000000ff;
			clrTemp=clrTemp>>8;
			clrB=clrTemp&0x000000ff;
			
			clrB=0.20*clrB;
			clrR=0.35*clrR;
			clrG=0.45*clrG;
			clrB=clrR+clrG+clrB;
			
			Value=Value<1?1:Value;
			Value=Value>255?255:Value;

			//将辉度小于给定阀值的象素设置为黑色,
			//否则设置为白色。
			//
			if(clrB<Value)
				clrB=0;
			else
				clrB=255;
		
			clrWhtBlk=RGB(clrB,clrB,clrB);
			m_pDC->SetPixel (ix,iy,clrWhtBlk);
		
			pFrameBuff[sIndex+ix].clrRGBA =clrWhtBlk;
		}
	}
}

/////////////////////////////////////////////////
//纹波处理函数:在指定区域内,按给定参数值,依据
//相应的算法实现图像的处理。
//
void CConversionView::Wave(RECT rSel,int Value)
{
	int ix,iy;
	DWORD sIndex;
	UINT wUpper,hUpper;
	
	int yO;
	int yCalc;
	double radian,amplitude;
	double pi = 3.1415926535;
	
	COLORREF clrWave;

	m_pDC->SetROP2 (R2_COPYPEN);
	wUpper=biWidth<rSel.right+1 ?biWidth:rSel.right+1  ;
	hUpper=biHeight<rSel.bottom +1 ?biHeight:rSel.bottom +1 ;
	
	amplitude=(rSel.bottom -rSel.top +1)>>Value;
    
	//通过给定幅度和周期对象素的位置进行扰动,并重新显示
	//
	for(ix=rSel.left;ix<wUpper;ix++)
	{
		radian=pi*(ix-rSel.left )/5.0;
		yCalc=amplitude*sin(radian);
		for(iy=rSel.top ;iy<hUpper;iy++)
		{
			if(yCalc>=0)
			{
				yO=iy+yCalc;
				if(yO>rSel.bottom)
				{
					yO-=rSel.bottom;
					yO+=rSel.top-1; 
				}
			}
			else
			{
				yO=iy+yCalc;
				if(yO<rSel.top)
				{
					yO=rSel.top-yO;
					yO=rSel.bottom-yO+1; 
				}
			}
			
			sIndex=yO*biWidth+ix;
			clrWave=pBuff[sIndex].clrRGBA ;

			m_pDC->SetPixel (ix,iy,clrWave);
			sIndex=iy*biWidth+ix;
			pFrameBuff[sIndex].clrRGBA =clrWave;
		}
	}
}

/////////////////////////////////////////////////
//对比度处理函数:在指定区域内,按给定参数值,依据
//相应的算法实现图像的处理。
//
void CConversionView::Contrast(RECT rSel,int Value)
{
	int ix,iy;
	DWORD dIndex,sIndex;
	UINT wUpper,hUpper;

	int lower,upper;
	int clrR,clrG,clrB;
	COLORREF clrContrast,clrTemp;
	

	m_pDC->SetROP2 (R2_COPYPEN);
	wUpper=biWidth<rSel.right+1  ?biWidth:rSel.right+1  ;
	hUpper=biHeight<rSel.bottom+1  ?biHeight:rSel.bottom+1  ;
	
	//将当前象素颜色变换到离近的离散点颜色值
	//
	for(iy=rSel.top ;iy<hUpper;iy++)
	{
		sIndex=iy*biWidth;
		for(ix=rSel.left ;ix<wUpper;ix++)
		{
			clrTemp=pBuff[sIndex+ix].clrRGBA ;
			clrR=clrTemp&0x000000ff;
			clrTemp=clrTemp>>8;
			clrG=clrTemp&0x000000ff;
			clrTemp=clrTemp>>8;
			clrB=clrTemp&0x000000ff;

			Value=Value<1?1:Value;

⌨️ 快捷键说明

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