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