filtermirrorview.cpp

来自「这是树上的代码」· C++ 代码 · 共 239 行

CPP
239
字号
// FilterMirrorView.cpp : implementation of the CFilterMirrorView class
//

#include "stdafx.h"
#include "FilterMirror.h"

#include "FilterMirrorDoc.h"
#include "FilterMirrorView.h"

#include "math.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CFilterMirrorView

IMPLEMENT_DYNCREATE(CFilterMirrorView, CView)

BEGIN_MESSAGE_MAP(CFilterMirrorView, CView)
	//{{AFX_MSG_MAP(CFilterMirrorView)
	ON_COMMAND(ID_PICTURE_YOUHUA, OnPictureYouhua)
	ON_COMMAND(ID_PICTURE_RETURN, OnPictureReturn)
	ON_COMMAND(ID_PICTURE_MUKE, OnPictureMuke)
	ON_COMMAND(ID_PICTURE_LIGHT, OnPictureLight)
	ON_COMMAND(ID_PICTURE_FUDIAO, OnPictureFudiao)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFilterMirrorView construction/destruction

CFilterMirrorView::CFilterMirrorView()
{
	// TODO: add construction code here

}

CFilterMirrorView::~CFilterMirrorView()
{
	//***************************************
	//***************************************
      delete m_bmp;//撤消位图指针对象以释放内存空间
	//***************************************
	//***************************************

}

BOOL CFilterMirrorView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CFilterMirrorView drawing
void CFilterMirrorView::OnDraw(CDC* pDC)
{
	CFilterMirrorDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	//***************************************
	//***************************************
     CDC* MemDC=new CDC;//创建一个新的内存用于存放要做处理的位图资源
     MemDC->CreateCompatibleDC(pDC);
     MemDC->SelectObject(m_bmp);//将要做处理的位图资源选入新建的内存当中
	 pDC->BitBlt(0,0,299,221,MemDC,0,0,SRCCOPY);//将新建内存中的位图拷贝到显示屏幕上
	 delete MemDC;
	//***************************************
	//***************************************

}

void CFilterMirrorView::OnInitialUpdate() 
{
	CView::OnInitialUpdate();
	//***************************************
	//***************************************
	 m_bmp=new CBitmap;//建立新的位图指针对象
	 m_bmp->LoadBitmap(IDB_BITMAP);//装载一个ID号为IDB_BITMAP的位图资源
	//***************************************
	//***************************************

	
}

/////////////////////////////////////////////////////////////////////////////
// CFilterMirrorView printing

BOOL CFilterMirrorView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CFilterMirrorView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CFilterMirrorView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CFilterMirrorView diagnostics

#ifdef _DEBUG
void CFilterMirrorView::AssertValid() const
{
	CView::AssertValid();
}

void CFilterMirrorView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CFilterMirrorDoc* CFilterMirrorView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFilterMirrorDoc)));
	return (CFilterMirrorDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CFilterMirrorView message handlers

//**油画效果处理代码
void CFilterMirrorView::OnPictureYouhua() 
{
	CClientDC dc(this);
	dc.SetMapMode(MM_TEXT);//设置屏幕逻辑坐标的映射方式
    for(int i=0;i<299;i++)
	  {
		  for(int j=0;j<221;j++)
		  {
	 m_pxiel[i+2][j+2]=dc.GetPixel(i+2,j+2);//得到次相邻像素的RGB颜色值
	 red=m_pxiel[i+2][j+2]&RGB(255,0,0);//得到次相邻像素的红色元素的值
     green=(m_pxiel[i+2][j+2]>>8)&RGB(255,0,0);//得到次相邻像素的绿色元素的值
	 blue=(m_pxiel[i+2][j+2]>>16)&RGB(255,0,0);//得到次相邻像素的蓝色元素的值
	 dc.SetPixel(i,j,RGB(red,green,blue));//设置当前点像素的颜色值
		  }
	  }
	
}

//**灯光效果处理代码
void CFilterMirrorView::OnPictureLight() 
{
	CClientDC dc(this);
	dc.SetMapMode(MM_TEXT);//设置屏幕逻辑坐标的映射方式
	static a=130,b=60;//分别代表灯光光源的横坐标和纵坐标值
    for(int i=0;i<299;i++)
	  {
		  for(int j=0;j<221;j++)
		  {
	m_pxiel[i][j]=dc.GetPixel(i,j); //得到当前像素的RGB颜色值
	if((sqrt((a-i)*(a-i)+(b-j)*(b-j))-60)<0)
			{
    //当前像素红色元素的新值
	red=((m_pxiel[i][j]&RGB(255,0,0))+(int)(200*(1-(sqrt((a-i)*(a-i)+(b-j)*(b-j))+1)/60)));
    //当前像素绿色元素的新值
	green=(((m_pxiel[i][j]>>8)&RGB(255,0,0))+(int)(200*(1-(sqrt((a-i)*(a-i)+(b-j)*(b-j))+1)/60)));
    //当前像素蓝色元素的新值
	blue=(((m_pxiel[i][j]>>16)&RGB(255,0,0))+(int)(200*(1-(sqrt((a-i)*(a-i)+(b-j)*(b-j))+1)/60)));;
			  if(red<0)  red=0;
			  if(red>255) red=255;
			  if(green<0) green=0;
			  if(green>255) green=255;
			  if(blue<0) blue=0;
			  if(blue>255) blue=255;
			  dc.SetPixel(i,j,RGB(red,green,blue));//设置当前点像素的颜色值
			}
		  }
	  }
	
}

//**木刻滤镜效果的处理代码
void CFilterMirrorView::OnPictureMuke() 
{
	CClientDC dc(this);
	dc.SetMapMode(MM_TEXT);//设置屏幕逻辑坐标的映射方式
    for(int i=0;i<299;i++)
	  {
		  for(int j=0;j<221;j++)
		  {
		m_pxiel[i][j]=dc.GetPixel(i,j);//得到当前像素的RGB颜色值
	    red=m_pxiel[i][j]&RGB(255,0,0);//得到当前像素的红色元素的值
		green=(m_pxiel[i][j]>>8)&RGB(255,0,0);//得到当前像素的绿色元素的值
	 	blue=(m_pxiel[i][j]>>16)&RGB(255,0,0);//得到当前像素的蓝色元素的值
	    if((red+blue+green)/3>128)
		dc.SetPixel(i,j,RGB(0,0,0));//如果是深色,则用黑色代替该点像素的颜色值
		if((red+blue+green)/3<128)        
		dc.SetPixel(i,j,RGB(255,255,255));//如果是浅色,则用黑色代替该点像素的颜色值  
		  }
	  }
	
}

//**浮雕滤镜效果处理代码
void CFilterMirrorView::OnPictureFudiao() 
{
	CClientDC dc(this);
	dc.SetMapMode(MM_TEXT);//设置屏幕逻辑坐标的映射方式
    for(int i=0;i<299;i=i+1)
	  {
		  for(int j=0;j<221;j=j+1)
		  {
	m_pxiel[i][j]=dc.GetPixel(i,j);//得到当前像素的RGB颜色值
	m_pxiel[i+1][j+1]=dc.GetPixel(i+1,j+1);//得到相邻像素的RGB颜色值
    //当前像素红色元素的新值
	red=abs((m_pxiel[i][j]&RGB(255,0,0))-(m_pxiel[i+1][j+1]&RGB(255,0,0))+128);
    //当前像素绿色元素的新值
	green=abs(((m_pxiel[i][j]>>8)&RGB(255,0,0))-((m_pxiel[i+1][j+1]>>8)&RGB(255,0,0))+128);
    //当前像素蓝色元素的新值
	blue=abs(((m_pxiel[i][j]>>16)&RGB(255,0,0))-((m_pxiel[i+1][j+1]>>16)&RGB(255,0,0))+128);
	dc.SetPixel(i,j,RGB(red,green,blue));//设置当前点像素的颜色值
		  }
	  }
	
}

void CFilterMirrorView::OnPictureReturn() 
{
	Invalidate(TRUE);	//使图像还原
}

⌨️ 快捷键说明

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