?? filtermirrorview.cpp
字號:
// 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 + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -