📄 conversionview.cpp
字号:
}
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 + -