www.pudn.com > Palm.rar > PalmDoc.cpp
// PalmDoc.cpp : implementation of the CPalmDoc class
//
#include "stdafx.h"
#include "Palm.h"
#include "PalmDoc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPalmDoc
IMPLEMENT_DYNCREATE(CPalmDoc, CDocument)
BEGIN_MESSAGE_MAP(CPalmDoc, CDocument)
//{{AFX_MSG_MAP(CPalmDoc)
ON_COMMAND(ID_Gray, OnGray)
ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPalmDoc construction/destruction
CPalmDoc::CPalmDoc()
{
// TODO: add one-time construction code here
m_sizeDoc.cx = 800;
m_sizeDoc.cy = 600;
m_palDIB = NULL;
m_hDIB = NULL;
harris=false;
}
CPalmDoc::~CPalmDoc()
{
if (m_hDIB != NULL)
{
::GlobalFree((HGLOBAL) m_hDIB);
m_hDIB=NULL;
}
if (m_palDIB != NULL)
{
delete m_palDIB;
m_palDIB=NULL;
}
}
BOOL CPalmDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
m_hDIB = NewDIB(m_sizeDoc.cx, m_sizeDoc.cy,8);
InitDIBData();
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CPalmDoc serialization
void CPalmDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
}
/////////////////////////////////////////////////////////////////////////////
// CPalmDoc diagnostics
#ifdef _DEBUG
void CPalmDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CPalmDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CPalmDoc commands
BOOL CPalmDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;
// TODO: Add your specialized creation code here
//*****************打开图象文件。lpszPathName为图象文件名
BOOL b = ReadImgFile(lpszPathName); //ReadImgFile-<harris=false;
return b;
return TRUE;
}
BOOL CPalmDoc::CanCloseFrame(CFrameWnd* pFrame)
{
// TODO: Add your specialized code here and/or call the base class
return CDocument::CanCloseFrame(pFrame);
}
BOOL CPalmDoc::ReadImgFile(CString sName)
{
if (m_hDIB != NULL)
{
::GlobalFree((HGLOBAL) m_hDIB);
m_hDIB=NULL;
}
if (m_palDIB != NULL)
{
delete m_palDIB;
m_palDIB=NULL;
}
// replace calls to Serialize with ReadDIBFile function
CFile nFile;
if(!nFile.Open(sName,CFile::modeRead))
return false;
m_hDIB = ReadDIBFile(nFile);
nFile.Close();
InitDIBData();
if (m_hDIB == NULL)
return FALSE;
return TRUE;
}
BOOL CPalmDoc::InitDIBData()
{
if (m_palDIB != NULL)
{
delete m_palDIB;
m_palDIB = NULL;
}
if (m_hDIB == NULL)
{
return FALSE;
}
m_palDIB = new CPalette;
if (m_palDIB == NULL)
{
// we must be really low on memory
::GlobalFree((HGLOBAL) m_hDIB);
m_hDIB = NULL;
return FALSE;
}
if (::CreateDIBPalette(m_hDIB, m_palDIB) == NULL)
{
// DIB may not have a palette
delete m_palDIB;
m_palDIB = NULL;
}
return TRUE;
}
BOOL CPalmDoc::OnSaveDocument(LPCTSTR lpszPathName)
{
// TODO: Add your specialized code here and/or call the base class
CFile nFile;
if(m_hDIB == NULL)
return false;
nFile.Open(lpszPathName,CFile::modeWrite | CFile::modeCreate);
SaveDIB(m_hDIB, nFile);
nFile.Close();
return true;
return CDocument::OnSaveDocument(lpszPathName);
}
void CPalmDoc::OnGray()
{
// TODO: Add your command handler code here
int i,j;
unsigned char *lpSrc,*lpDst;//一个指向源、目的像素的移动指针
//对源图像进行操作
LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)m_hDIB);
int cxDIB = (int) ::DIBWidth(lpDIB);
int cyDIB = (int) ::DIBHeight(lpDIB);
LPSTR lpDIBBits=::FindDIBBits (lpDIB); //找到源图像中图像数据区起始位置
long lLineBytesSrc = WIDTHBYTES(cxDIB * 8 * 3);// 计算源24位真彩图像每行的字节数
int numColors=(int) ::DIBNumColors((char *)lpDIB);
if (numColors!=0) //如果numColors是0,则表示目前图像为24位真彩图
{
::GlobalUnlock((HGLOBAL) m_hDIB);
return;
}
//新创建一个8位(256级灰度)的DIB句柄
HDIB grayhDIB=NewDIB(cxDIB, cyDIB,8);
LPSTR glpDIB=(LPSTR)::GlobalLock((HGLOBAL)grayhDIB);
LPSTR glpDIBBits=::FindDIBBits (glpDIB);
long lLineBytesDst = WIDTHBYTES(cxDIB * 8);// 计算目标8位灰度图像每行的字节数
// 每行
for(i = 0; i < cyDIB; i++)
{
//每列
for(j = 0; j < cxDIB; j++)
{
// 指向DIB第i行,第j个象素的指针(这里的行为从上到下的)
lpSrc = (unsigned char*)lpDIBBits + lLineBytesSrc * (cyDIB - 1 - i) + j*3;
lpDst = (unsigned char*)glpDIBBits + lLineBytesDst * (cyDIB - 1 - i) + j;
*lpDst=(*lpSrc)/3+(*(lpSrc+1))/3+(*(lpSrc+2))/3;
}
}
m_hDIB=grayhDIB;
::GlobalUnlock((HGLOBAL) m_hDIB);
::GlobalUnlock((HGLOBAL) grayhDIB);
UpdateAllViews(NULL, 0, NULL);
}
void CPalmDoc::OnFileSaveAs()
{
// TODO: Add your command handler code here
}