【VC开源代码栏目提醒】:网学会员为广大网友收集整理了,faceView.cpp,希望对大家有所帮助!
// faceView.cpp : implementation of the CFaceView class
//
#include "stdafx.h"
#include "face.h"
#include "DIB.h"
#include "faceDoc.h"
#include "faceView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern class DIB gDib;
extern HANDLE hDIB;
extern HANDLE hDIBTemp;
extern int gheight;
extern int gwidth;
extern WORD gwBytesPerLine;
/////////////////////////////////////////////////////////////////////////////
// CFaceView
IMPLEMENT_DYNCREATE(CFaceView, CScrollView)
BEGIN_MESSAGE_MAP(CFaceView, CScrollView)
//{{AFX_MSG_MAP(CFaceView)
ON_COMMAND(ID_ERASION, OnErasion)
ON_COMMAND(ID_EYEMAP, OnEyemap)
ON_COMMAND(ID_EYEMAPC, OnEyemapc)
ON_COMMAND(ID_EYEMAPL, OnEyemapl)
ON_COMMAND(ID_GET_FACE_AREA, OnGetFaceArea)
ON_COMMAND(ID_LIGHTINGCONPENSATE, OnLightingconpensate)
ON_COMMAND(ID_SKINTONE, OnSkintone)
ON_COMMAND(ID_DELETE_FALSE_AREA, OnDeleteFalseArea)
ON_COMMAND(ID_DILATION, OnDilation)
ON_COMMAND(ID_ERASION_AGAIN, OnErasionAgain)
ON_COMMAND(ID_DILATION_FIRST, OnDilationFirst)
ON_COMMAND(ID_EYE_CB, OnEyeCb)
ON_COMMAND(ID_EYE_Cr, OnEYECr)
ON_COMMAND(ID_DELETE_FALSE_EYE, OnDeleteFalseEye)
ON_COMMAND(ID_DELETESCATER, OnDeletescater)
ON_COMMAND(ID_MOUSEMAP, OnMousemap)
ON_COMMAND(ID_ERASION_MOUSE, OnErasionMouse)
ON_COMMAND(ID_MOUTH_CENTER, OnMouthCenter)
ON_COMMAND(ID_DILATION_EYE, OnDilationEye)
ON_COMMAND(ID_EYE_CENTER, OnEyeCenter)
ON_COMMAND(ID_GOULE_FACE, OnGouleFace)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFaceView construction/destruction
CFaceView::CFaceView()
{
lpRgb = NULL;
lpYcc = NULL;
faceNum = 0;
for(int i=0; i<ImgRange; i++)
for (int j=0; j<ImgRange; j++)
{
this->emymapc[i][j] = false;
this->emymapl[i][j] = false;
this->lab[i][j] = false;
}
this->result = false;
}
CFaceView::~CFaceView()
{
}
BOOL CFaceView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CScrollView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CFaceView drawing
void CFaceView::OnDraw(CDC* pDC)
{
CFaceDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(hDIB)
gDib.PaintDIBTrue(pDC->GetSafeHdc(),CRect(0,0,gwidth,gheight),hDIB,CRect(0,0,gwidth,gheight),SRCCOPY);
// TODO: add draw code for native data here
}
void CFaceView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal;
// TODO: calculate the total size of this view
sizeTotal.cx = sizeTotal.cy = 100;
SetScrollSizes(MM_TEXT, sizeTotal);
}
/////////////////////////////////////////////////////////////////////////////
// CFaceView printing
BOOL CFaceView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CFaceView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CFaceView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CFaceView diagnostics
#ifdef _DEBUG
void CFaceView::AssertValid() const
{
CScrollView::AssertValid();
}
void CFaceView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CFaceDoc* CFaceView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFaceDoc)));
return (CFaceDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CFaceView message handlers
void CFaceView::OnErasion()
{
gDib.Erasion(hDIB);
gDib.Erasion(hDIB);
gDib.Erasion(hDIB);
Invalidate();
}
void CFaceView::OnEyemap()
{
LPBYTE lpData;
long lOffset;
lpData = gDib.FindDIBBits(hDIB);
for (int i=0; i<gheight; i++)
for (int j=0; j<gwidth; j++)
{
lOffset = gDib.PixelOffset(i, j, gwBytesPerLine);
if( this->emymapc[i][j] && this->emymapl[i][j])
{
*(lpData + lOffset++) = 255;
*(lpData + lOffset++) = 255;
*(lpData + lOffset++) = 255;
}
else
{
*(lpData + lOffset++) = 0;
*(lpData + lOffset++) = 0;
*(lpData + lOffset++) = 0;
}
}
Invalidate();
}
void CFaceView::OnEyemapc()
{
LPBYTE lpData;
if(lpYcc)
delete[] lpYcc;
lpYcc = new BYTE[gwBytesPerLine * gheight];
gDib.RgbtoYcb(hDIBTemp,lpYcc);
GlobalLock(hDIB);
lpData = gDib.FindDIBBits(hDIB);
//memcpy(lpData,gDib.YcctoRgb(lpYcc,gwBytesPerLine,gheight,gwidth),gwBytesPerLine*gheight);
gDib.EyeMapC(lpData,lpYcc,gwBytesPerLine,CRect(0,0,gwidth-1,gheight-1));
for(int i=0; i<gheight; i++)
for (int j=0; j<gwidth; j++)
{
long lOffset;
lOffset = gDib.PixelOffset(i, j, gwBytesPerLine);
if(*(lpData + lOffset) == 255)
{
this->emymapc[i][j] = true;
}
}
GlobalUnlock(hDIB);
Invalidate();
}
void CFaceView::OnEyemapl()
{
LPBYTE lpDataR,lpDataD;
if(lpYcc)
delete[] lpYcc;
GlobalLock(hDIBTemp);
lpDataR = gDib.FindDIBBits(hDIBTemp);
lpYcc = new BYTE[gwBytesPerLine * gheight];
gDib.RgbtoYcb(hDIBTemp,lpYcc);
lpDataD = gDib.FindDIBBits(hDIB);
memcpy(lpDataD,lpDataR,gwBytesPerLine*gheight);
gDib.EyeMapL(lpDataD,gwBytesPerLine, CRect(0,0,gwidth-1,gheight-1));
for (int i=0; i<gheight; i++)
for (int j=0; j<gwidth; j++)
{
long lOffset;
lOffset = gDib.PixelOffset(i, j, gwBytesPerLine);
if(*(lpDataD + lOffset) == 255)
{
this->emymapl[i][j] = true;
}
}
GlobalUnlock(hDIBTemp);
Invalidate();
}
void CFaceView::OnGetFaceArea()
{
gDib.FaceLocate(hDIB,faceLocation,faceNum);
Invalidate();
}
void CFaceView::OnLightingconpensate()
{
hDIBTemp = gDib.CopyHandle(hDIB);
gDib.LightingCompensate(hDIB);
GlobalUnlock(hDIB);
Invalidate();
}
void CFaceView::OnSkintone()
{
lpYcc = new BYTE[gwBytesPerLine * gheight];
gDib.RgbtoYcb(hDIB,lpYcc);
gDib.YccTransform(lpYcc, gwBytesPerLine,gheight,gwidth);
gDib.faceear(lpYcc,gwBytesPerLine,gheight,gwidth,flag);
LPBYTE lpData = (LPBYTE)GlobalLock(hDIB)+sizeof(BITMAPINFOHEADER);
for (int i=0; i<gheight; i++)
for (int j=0; j<gwidth; j++)
{
long lOffset = gDib.PixelOffset(i, j, gwBytesPerLine);
if (flag[i][j] == true)
{
*(lpData + lOffset+
上一篇:
faceDoc.cpp
下一篇:
让我掉下眼泪的