www.pudn.com > rawbmp.rar > CImageView.cpp


// CImageView.cpp : implementation of the CCImageView class 
// 
 
#include "stdafx.h" 
#include "CImage.h" 
#include "math.h" 
 
#include "CImageDoc.h" 
#include "CImageView.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
#define WIDTHBYTES(bits)    (((bits) + 31) / 32 * 4) // 因为宽度是以四个字节为单位存贮的 
 
///////////////////////////////////////////////////////////////////////////// 
// CCImageView 
 
IMPLEMENT_DYNCREATE(CCImageView, CView) 
 
BEGIN_MESSAGE_MAP(CCImageView, CView) 
	//{{AFX_MSG_MAP(CCImageView) 
	ON_COMMAND(ID_FILE_OPEN, OnFileOpen) 
	ON_WM_PAINT() 
	ON_COMMAND(ID_FILE_SAVE, OnFileSave) 
	ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs) 
	//}}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() 
 
///////////////////////////////////////////////////////////////////////////// 
// CCImageView construction/destruction 
 
CCImageView::CCImageView() 
{ 
	// TODO: add construction code here 
 
} 
 
CCImageView::~CCImageView() 
{ 
} 
 
BOOL CCImageView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
 
	return CView::PreCreateWindow(cs); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CCImageView drawing 
 
void CCImageView::OnDraw(CDC* pDC) 
{ 
	CCImageDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	// TODO: add draw code for native data here 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CCImageView printing 
 
BOOL CCImageView::OnPreparePrinting(CPrintInfo* pInfo) 
{ 
	// default preparation 
	return DoPreparePrinting(pInfo); 
} 
 
void CCImageView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add extra initialization before printing 
} 
 
void CCImageView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add cleanup after printing 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CCImageView diagnostics 
 
#ifdef _DEBUG 
void CCImageView::AssertValid() const 
{ 
	CView::AssertValid(); 
} 
 
void CCImageView::Dump(CDumpContext& dc) const 
{ 
	CView::Dump(dc); 
} 
 
CCImageDoc* CCImageView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCImageDoc))); 
	return (CCImageDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CCImageView message handlers 
 
void CCImageView::OnFileOpen()  
{ 
	// TODO: Add your command handler code here 
	// 打开文件对话框 
	CFileDialog dlg(TRUE,"*.BMP|*.bmp|*.RAW|*.raw",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, 
					"BMP(*.BMP)|*.bmp|RAW(*.RAW)|*.raw||",NULL); 
 
	CCImageApp *app = (CCImageApp *)AfxGetApp();  
 
	if(dlg.DoModal()==IDOK) 
	{ 
		CString str;                   // 存贮扩展名 
		str=dlg.GetFileExt();          // 获得文件扩展名 
 
		// 如果是RAW格式的图像,则以下打开处理 
		if((str=="RAW")||(str=="raw")) 
		{ 
			CFile rawfile; 
			rawfile.Open(dlg.GetPathName(),CFile::modeRead);  // 打开文件 
			m_nDataSize=rawfile.GetLength();                  // 获取文件长度 
			m_pImage=new unsigned char[m_nDataSize];          // 分配数据内存 
			rawfile.ReadHuge(m_pImage,m_nDataSize);           // 读取文件 
 
			rawfile.Close(); 
			m_nWidth=(LONG)sqrt(m_nDataSize); 
			m_nHeight=m_nWidth; 
			m_flag=1;                                       // RAW格式的图像标记 
		} 
 
		// 如果是.BMP格式的图像,则以下打开方式 
		else if((str=="BMP")||(str=="bmp")) 
		{ 
			CFile bmpfile; 
			if(!bmpfile.Open(dlg.GetPathName(),CFile::modeRead)) // 判断文件打开 
				return ; 
 
			ZeroMemory(&m_bmfh,sizeof(BITMAPFILEHEADER)); 
			bmpfile.Read(&m_bmfh,sizeof(BITMAPFILEHEADER));      // 读取文件头 
			ZeroMemory(&m_bmih,sizeof(BITMAPINFOHEADER)); 
			bmpfile.Read(&m_bmih,sizeof(BITMAPINFOHEADER));      // 读取信息头 
			m_nColorUse=m_bmih.biClrUsed;                        // 实际用到的颜色 
 
			if(m_nColorUse==0) 
			{ 
				switch(m_bmih.biBitCount) 
				{ 
				case 1: 
					m_nColorUse=2; 
					break; 
				case 4: 
					m_nColorUse=16; 
					break; 
				case 8: 
					m_nColorUse=256; 
					break; 
				default: 
					break; 
				} 
			} 
			m_pColorTable=new RGBQUAD[m_nColorUse];                   // 分配颜色表的内存 
			bmpfile.Read(m_pColorTable,m_nColorUse*sizeof(RGBQUAD));  // 读取颜色数入颜色表中 
			m_nHeight=m_bmih.biHeight;                                // 图像数据高度 
			m_nWidth=m_bmih.biWidth;                                  // 图像数据高度 
			m_nDataSize=WIDTHBYTES(m_nWidth*m_bmih.biBitCount)*m_nHeight;// 填充后的图像大小 
			m_pImage=new unsigned char[m_nDataSize];                     // 分配数据内存 
			bmpfile.ReadHuge(m_pImage,m_nDataSize);                      // 读取图像数据 
			bmpfile.Close(); 
 
			/*CFile bmpfile; 
			if(!bmpfile.Open(dlg.GetPathName(),CFile::modeRead)) // 判断文件打开 
				return ;*/ 
			pathname=dlg.GetPathName(); 
			m_flag=2;                                                    // BMP格式的图像标记 
		} 
 
		Invalidate(); 
	} 
	 
} 
 
void CCImageView::OnPaint()  
{ 
	CPaintDC dc(this); // device context for painting 
	 
	// TODO: Add your message handler code here 
	int i,j; 
	if(m_flag==1) 
	{ 
		unsigned char gray; 
		for( i=0;iCreateCompatibleDC(&dc); 
      	p->SelectObject(&bmp); 
        bmp.GetBitmap(&Bitmap); 
        //CRect rect; 
	    //GetActiveWindow()->GetClientRect(&rect); 
	    //dc.StretchBlt(0,0,rect.Width(),rect.Height(),p,0,0,Bitmap.bmWidth,Bitmap.bmHeight,SRCCOPY); 
		dc.BitBlt(0,0,Bitmap.bmWidth,Bitmap.bmHeight,p,0,0,SRCCOPY); 
        p->DeleteDC(); 
	} 
	 
	// Do not call CView::OnPaint() for painting messages 
} 
 
void CCImageView::OnFileSave()  
{ 
	// TODO: Add your command handler code here 
	CFileDialog filedlg(FALSE,"*.RAW|*.raw|*.BMP|*.bmp",NULL, 
				OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"*.RAW|*.raw|*.BMP|*.bmp||",NULL); 
 
	if(filedlg.DoModal()==IDOK) 
	{ 
		CString str;                 // 存贮扩展名 
		str=filedlg.GetFileExt();    // 取得扩展名 
 
		// 储存为raw图像 
		if((str=="RAW")||(str=="raw")) 
		{ 
			CFile rawfile; 
 
			// 如果打开的是raw图像,则下列存贮方法 
			if(m_flag==1) 
			{ 
				if(!rawfile.Open(filedlg.GetFileName(),CFile::modeCreate|CFile::modeWrite)) 
					return; 
				 
				rawfile.WriteHuge((LPVOID)m_pImage,m_nDataSize); 
				rawfile.Close(); 
			} 
 
			// 如果打开的是bmp图像,则下列存贮方法 
			else if(m_flag==2) 
			{ 
				if(!rawfile.Open(filedlg.GetFileName(),CFile::modeCreate|CFile::modeWrite)) 
					return; 
				unsigned char* temp; 
				LONG i,j;              // 循环变量 
				DWORD LineBytes; 
				LineBytes=WIDTHBYTES(m_nWidth*m_bmih.biBitCount);  // 填充后的宽度 
 
				// 因为raw图像从上到下显示,而bmp图像是从下到上存贮道的,所以要从最后一行开始读取它的数据并存贮为raw图像 
				for(i=m_nHeight-1;i>=0;i--) 
				{ 
					for(j=0;j<=m_nWidth-1;j++) 
					{ 
						temp=(m_pImage+i*LineBytes+j); 
						rawfile.WriteHuge(temp,1); 
					} 
				} 
				rawfile.Close(); 
			} 
 
		} 
 
		// 储存bmp图像 
		else if((str=="BMP")||(str=="bmp")) 
		{ 
			CFile bmpfile; 
		 
			if(!bmpfile.Open(filedlg.GetPathName(),CFile::modeCreate|CFile::modeWrite)) 
				return; 
			bmpfile.Write(&m_bmfh,sizeof(BITMAPFILEHEADER)); 
			bmpfile.Write(&m_bmih,sizeof(BITMAPINFOHEADER)); 
			bmpfile.Write(m_pColorTable,m_nColorUse*sizeof(RGBQUAD)); 
			bmpfile.Write(m_pImage,m_nDataSize); 
			bmpfile.Close();	 
		} 
		Invalidate(); 
		return; 
 
	} 
	 
} 
 
void CCImageView::OnFileSaveAs()  
{ 
	// TODO: Add your command handler code here 
    OnFileSave(); 
	 
}