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 + -
显示快捷键?