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();
}