www.pudn.com > pict.rar > ImageMeasureDoc2.cpp


// ImageMeasureDoc.cpp : implementation of the CImageMeasureDoc class 
// 
 
#include "stdafx.h" 
#include "ImageMeasure.h" 
#include  
 
#include "ImageMeasureDoc.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CImageMeasureDoc 
 
IMPLEMENT_DYNCREATE(CImageMeasureDoc, CDocument) 
 
BEGIN_MESSAGE_MAP(CImageMeasureDoc, CDocument) 
	//{{AFX_MSG_MAP(CImageMeasureDoc) 
	ON_COMMAND(ID_SMOOTH, OnSmooth) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CImageMeasureDoc construction/destruction 
 
CImageMeasureDoc::CImageMeasureDoc() 
{ 
	pBits = NULL; 
	// TODO: add one-time construction code here 
 
} 
 
CImageMeasureDoc::~CImageMeasureDoc() 
{ 
} 
 
BOOL CImageMeasureDoc::OnNewDocument() 
{ 
	if (!CDocument::OnNewDocument()) 
		return FALSE; 
 
	// TODO: add reinitialization code here 
	// (SDI documents will reuse this document) 
 
	return TRUE; 
} 
 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CImageMeasureDoc serialization 
 
void CImageMeasureDoc::Serialize(CArchive& ar) 
{ 
	if (ar.IsStoring()) 
	{ 
		// TODO: add storing code here 
	} 
	else 
	{ 
		// TODO: add loading code here 
	} 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CImageMeasureDoc diagnostics 
 
#ifdef _DEBUG 
void CImageMeasureDoc::AssertValid() const 
{ 
	CDocument::AssertValid(); 
} 
 
void CImageMeasureDoc::Dump(CDumpContext& dc) const 
{ 
	CDocument::Dump(dc); 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CImageMeasureDoc commands 
 
BOOL CImageMeasureDoc::OnOpenDocument(LPCTSTR lpszPathName)  
{ 
	if (!CDocument::OnOpenDocument(lpszPathName)) 
	{ 
		AfxMessageBox("open failed"); 
		return FALSE; 
	} 
 
	HBITMAP hbitmap = (HBITMAP)::LoadImage(NULL,lpszPathName,IMAGE_BITMAP, 
		        0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE); 
	if( hbitmap==NULL) 
	{ 
		AfxMessageBox("The file doesn't contain a dib"); 
		return false; 
	} 
	m_Bitmap.Attach(hbitmap); 
	if((HBITMAP)m_Bitmap!=NULL) 
	{ 
		DIBSECTION dib; 
		m_Bitmap.GetObject(sizeof(DIBSECTION),&dib); 
		m_lWidth = dib.dsBmih.biWidth; 
		m_lHeight = dib.dsBmih.biHeight; 
		pBits = (unsigned char *)dib.dsBm.bmBits; 
 
	    m_Color = dib.dsBmih.biBitCount; 
 
	switch(m_Color) 
	{ 
	case(8): 
		WIDTH = (m_lWidth + 3)/4; 
		WIDTH *=4; 
		break; 
	case(24): 
		WIDTH = (m_lWidth*3 +3)/4; 
		WIDTH *=4; 
		break; 
	default: 
		break; 
	} 
	} 
 
 
 
	 
	// TODO: Add your specialized creation code here 
	 
	return TRUE; 
} 
 
BOOL CImageMeasureDoc::OnSaveDocument(LPCTSTR lpszPathName)  
{ 
	// TODO: Add your specialized code here and/or call the base class 
	if((HBITMAP) m_Bitmap!=NULL) 
	{ 
		BITMAPFILEHEADER bmfHdr;   //BMP文件头 
 
		DWORD dwDIBsize=0;           //DIB大小 
 
		DIBSECTION ds; 
		m_Bitmap.GetObject(sizeof(DIBSECTION),&ds); 
		LPBITMAPINFOHEADER lpBI; 
		lpBI=&ds.dsBmih; 
 
		dwDIBsize+=sizeof(BITMAPINFOHEADER); 
		if(m_Color==8) 
		{ 
			dwDIBsize+=DWORD(sizeof(RGBQUAD)*pow(2,8)); 
		} 
		dwDIBsize+=WIDTH*m_lHeight; 
 
		bmfHdr.bfType=0x4D42; 
		bmfHdr.bfSize=dwDIBsize+sizeof(BITMAPFILEHEADER); 
		bmfHdr.bfReserved1=0; 
		bmfHdr.bfReserved2=0; 
		bmfHdr.bfOffBits=bmfHdr.bfSize-WIDTH*m_lHeight; 
 
		unsigned char* pBmpFile=new unsigned char[dwDIBsize+sizeof(BITMAPFILEHEADER)]; 
		memcpy(pBmpFile,&bmfHdr,sizeof(BITMAPFILEHEADER)); 
		memcpy(pBmpFile+sizeof(BITMAPFILEHEADER),lpBI,sizeof(BITMAPINFOHEADER)); 
		if(m_Color==8) 
		{ 
			CClientDC dc(NULL); 
			RGBQUAD* pRGB = new RGBQUAD[256]; 
 
            CDC memDC; 
            memDC.CreateCompatibleDC (&dc); 
            CBitmap* pOldBitmap = memDC.SelectObject (&m_Bitmap); 
            ::GetDIBColorTable ((HDC) memDC, 0, 256, pRGB); 
            memDC.SelectObject (pOldBitmap); 
		    memcpy(pBmpFile+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER),pRGB, 
				    sizeof(RGBQUAD)*256); 
			delete [] pRGB; 
		} 
		memcpy(pBmpFile+bmfHdr.bfOffBits,pBits,WIDTH*m_lHeight); 
 
		CFile file; 
		CFileException e; 
		if(!file.Open(lpszPathName,CFile::modeCreate|CFile::modeWrite| 
			CFile::modeNoTruncate|CFile::shareDenyNone,&e)) 
		{ 
			e.ReportError(); 
			return false; 
		} 
		file.Write(pBmpFile,bmfHdr.bfSize); 
 
		delete [] pBmpFile; 
        return true; 
	} 
	 
	return CDocument::OnSaveDocument(lpszPathName); 
} 
 
void CImageMeasureDoc::DeleteContents()  
{ 
	// TODO: Add your specialized code here and/or call the base class 
 
	if((HBITMAP)m_Bitmap!=NULL) 
	{ 
		m_Bitmap.DeleteObject(); 
	} 
	CDocument::DeleteContents(); 
} 
 
 
void CImageMeasureDoc::OnSmooth()  
{ 
	// TODO: Add your command handler code here 
		float a[3][3]; 
		for (float time=0 ; time