⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jpegview.cpp

📁 图象压缩算法的实现,十分具有参考价值的,赫赫有名
💻 CPP
字号:
// JPEGView.cpp : implementation of the CJPEGView class
//

#include "stdafx.h"
#include "JPEG.h"

#include "JPEGDoc.h"
#include "JPEGView.h"

#include "math.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CJPEGView

IMPLEMENT_DYNCREATE(CJPEGView, CScrollView)

BEGIN_MESSAGE_MAP(CJPEGView, CScrollView)
	//{{AFX_MSG_MAP(CJPEGView)
	ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
	ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs)
	ON_COMMAND(ID_IJPEG, OnIjpeg)
	ON_UPDATE_COMMAND_UI(ID_IJPEG, OnUpdateIjpeg)
	ON_WM_KEYDOWN()
	ON_COMMAND(ID_JPEG, OnJpeg)
	ON_UPDATE_COMMAND_UI(ID_JPEG, OnUpdateJpeg)
	ON_COMMAND(ID_Invert, OnInvert)
	ON_COMMAND(ID_Invert_Zhe, OnInvertZhe)
	ON_UPDATE_COMMAND_UI(ID_Invert, OnUpdateInvert)
	ON_UPDATE_COMMAND_UI(ID_Invert_Zhe, OnUpdateInvertZhe)
	ON_WM_MOUSEMOVE()
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CJPEGView construction/destruction

CJPEGView::CJPEGView()
{
	// TODO: add construction code here
}

CJPEGView::~CJPEGView()
{
}

BOOL CJPEGView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CJPEGView drawing

void CJPEGView::OnDraw(CDC* pDC)
{
	CJPEGDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	CRect rc;
	GetClientRect(rc);
	int x,y;
	if(rc.right>m_Dib.width)
		x=rc.right/2-m_Dib.width/2;		//显示图象居中
	else
		x=0;
	if(rc.bottom>m_Dib.height)
		y=rc.bottom/2-m_Dib.height/2;
	else
		y=0;
	

	if(m_Dib.m_bit24)
		m_Dib.Show(pDC,x,y);			//用show()显示24色图象
	else
	{
		m_Dib.SetPalette(pDC);
		m_Dib.Draw(pDC,x,y);		//用Draw()函数显示非24色图象(如灰度图,256色图)
	}
//	TRACE("中华人民共和国!!!");

///////////////////////////////////////////

//	int data2=100;
//	CString st;
//	pDC->SetTextAlign(TA_LEFT);
//	pDC->SetBkColor(RGB(0,0,0));
//	pDC->SetTextColor(RGB(255,0,255));
//	st.Format("data1=%d",data1);
//	pDC->TextOut(10,20,st);
//	for(int i=0;i<10;i++)
//	{
//		st.Format("data%d=%d",i,data2+i);
//		pDC->TextOut(10+i*80,40,st);
//	}
////////////////////////////////////////////

}

void CJPEGView::OnInitialUpdate()
{


	CSize sizeTotal;
	// TODO: calculate the total size of this view
	sizeTotal.cx = m_Dib.width;			// 设置工作区域的最大宽度。
	sizeTotal.cy = m_Dib.height;		// 设置工作区域的最大高度。
//	TRACE("\nx=%d,y=%d\n\n",sizeTotal.cx,sizeTotal.cy);
	SetScrollSizes(MM_TEXT, sizeTotal);	//动态调整滚动条。
	//CWnd::SetScrollRange(SB_HORZ,0,1024,TRUE);
	//CSize sizeTotal(30000, 40000); // 30-by-40 cm
    //CSize sizeLine = CSize(sizeTotal.cx / 100, sizeTotal.cy / 100);
    //SetScrollSizes(MM_HIMETRIC, sizeTotal, sizeTotal, sizeLine);
	CScrollView::OnInitialUpdate();
}

/////////////////////////////////////////////////////////////////////////////
// CJPEGView printing

BOOL CJPEGView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CJPEGView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CJPEGView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CJPEGView diagnostics

#ifdef _DEBUG
void CJPEGView::AssertValid() const
{
	CScrollView::AssertValid();
}

void CJPEGView::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}

CJPEGDoc* CJPEGView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CJPEGDoc)));
	return (CJPEGDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CJPEGView message handlers

void CJPEGView::OnFileOpen() 
{
	// TODO: Add your command handler code here
	static char szFilter[]="BMP Files(*.BMP)|*.BMP||";
	CFileDialog FileDlg(TRUE,						//此处为TRUE时表示是一个打开文件的对话框
		NULL,NULL,OFN_HIDEREADONLY,szFilter);
	if(FileDlg.DoModal()==IDOK&&m_Dib.Load(FileDlg.GetPathName()))
	{
		InvalidateRect(NULL,TRUE);
		UpdateWindow();	
		
		CStatusBar * pStatus=
			(CStatusBar *)AfxGetApp()->m_pMainWnd->GetDescendantWindow(ID_VIEW_STATUS_BAR);
		if(pStatus)
		{
			char tbuf[45];
			CString colornum;
			if(m_Dib.m_pBIH->biBitCount==24)
			{
				colornum="24b";
			}
			else if(m_Dib.m_pBIH->biBitCount==8)
			{
				colornum="256";
			}
			else if(m_Dib.m_pBIH->biBitCount==4)
			{
				colornum="16";
				
			}
			else
			{
				colornum="2";
			}
			
			sprintf(tbuf,"%d×%d×%s BMP %ld Byte",m_Dib.width,m_Dib.height,colornum,m_Dib.BmpFileLength);
			pStatus->SetPaneText(2,tbuf);
			pStatus->SetPaneText(1,FileDlg.GetFileName());
		}
	}
	OnInitialUpdate();		//更新滚动条的滚动范围
}

void CJPEGView::OnFileSaveAs() 
{
	// TODO: Add your command handler code here
	static char szFilter[]="BMP Files(*.BMP)|*.BMP||";
	CFileDialog FileSaveAs(FALSE,					//此处为FALSE时表示是一个另存为的对话框
		"bmp",NULL,OFN_OVERWRITEPROMPT,szFilter);	//此处的第二个参数是附加默认的扩展名为.bmp,为NULL时表明不附加扩展名
	if(FileSaveAs.DoModal()==IDOK&&m_Dib.Save(FileSaveAs.GetPathName()))
	{
		InvalidateRect(NULL,TRUE);
		UpdateWindow();

		CStatusBar * pStatus=
			(CStatusBar *)AfxGetApp()->m_pMainWnd->GetDescendantWindow(ID_VIEW_STATUS_BAR);
		if(pStatus)
		{
			pStatus->SetPaneText(1,FileSaveAs.GetFileName());
		}

	}	
}


BOOL CJPEGView::OnJpeg() 
{
	// TODO: Add your command handler code here
	if(m_Dib.width>1600||m_Dib.height>1600)
	{
		AfxMessageBox("本软件目前只能对小于等于1600*1600的BMP图像进行压缩!!!");
		return FALSE;
	}
	static char szFilter[]="JPEG Files(*.jpg)|*.jpg||";
	CFileDialog FileSaveAs(FALSE,					//此处为FALSE时表示是一个另存为的对话框
		"jpg",NULL,OFN_OVERWRITEPROMPT,szFilter);	//此处的第二个参数是附加默认的扩展名为.jpg,为NULL时表明不附加扩展名
	if(FileSaveAs.DoModal()==IDOK&&m_Dib.SaveJpeg(FileSaveAs.GetPathName()))  
	{
		InvalidateRect(NULL,TRUE);
		UpdateWindow();

		CStatusBar * pStatus=
			(CStatusBar *)AfxGetApp()->m_pMainWnd->GetDescendantWindow(ID_VIEW_STATUS_BAR);
		if(pStatus)
		{
			char tbuf[45];
			int colornum;
			if(m_Dib.m_pBIH->biBitCount==24)
				colornum=24;
			else
				colornum=(int)pow(2,m_Dib.m_pBIH->biBitCount);

			sprintf(tbuf,"%d×%d×%d JPG  大小待计算",m_Dib.width,m_Dib.height,colornum);
			pStatus->SetPaneText(2,tbuf);
			pStatus->SetPaneText(1,FileSaveAs.GetFileName());

		}

	}
////////////////////////////////////

	return TRUE;
}

void CJPEGView::OnUpdateJpeg(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	BOOL loadfile;
	if((m_Dib.m_bit24==1||m_Dib.m_bit24==0)&&m_Dib.m_pDib!=NULL)
		loadfile=TRUE;
	else 
		loadfile=FALSE;
	pCmdUI->Enable(loadfile);
}

//////////////////////////////
////  由JPEG变为BMP文件   ////
//////////////////////////////
void CJPEGView::OnIjpeg() 
{
	// TODO: Add your command handler code here

}

void CJPEGView::OnUpdateIjpeg(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(FALSE);
}

////////////本函数实现用键盘进行滚动条的操作//////////////
void CJPEGView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	switch(nChar)
	{
	case VK_HOME:
		OnVScroll(SB_TOP,0,NULL);
		OnHScroll(SB_LEFT,0,NULL);
		break;
	case VK_END:
		OnVScroll(SB_BOTTOM,0,NULL);
		OnHScroll(SB_RIGHT,0,NULL);
		break;
	case VK_UP:
		OnVScroll(SB_LINEUP,0,NULL);
		break;
	case VK_DOWN:
		OnVScroll(SB_LINEDOWN,0,NULL);
		break;
	case VK_PRIOR:
		OnVScroll(SB_PAGEUP,0,NULL);
		break;
	case VK_NEXT:
		OnVScroll(SB_PAGEDOWN,0,NULL);
		break;
	case VK_LEFT:
		OnHScroll(SB_LINELEFT,0,NULL);
		break;
	case VK_RIGHT:
		OnHScroll(SB_LINERIGHT,0,NULL);
		break;
	default:
		break;
	}
}

void CJPEGView::OnInvert() 
{
	// TODO: Add your command handler code here
	m_Dib.ShangInvert();
	Invalidate();
}

void CJPEGView::OnInvertZhe() 
{
	// TODO: Add your command handler code here
	m_Dib.ZheInvert();
	Invalidate();
}

void CJPEGView::OnUpdateInvert(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(m_Dib.m_bit24);
}

void CJPEGView::OnUpdateInvertZhe(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(m_Dib.m_bit24);
}



void CJPEGView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
{
	// TODO: Add your specialized code here and/or call the base class
	
	
}


//在状态栏显示鼠标的座标
void CJPEGView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CStatusBar * pStatus=
		(CStatusBar *)AfxGetApp()->m_pMainWnd->GetDescendantWindow(ID_VIEW_STATUS_BAR);
	if(pStatus)
	{
		char tbuf[40];
		sprintf(tbuf,"(%3d,%3d)",point.x,point.y);
		pStatus->SetPaneText(4,tbuf);
	}
	CScrollView::OnMouseMove(nFlags, point);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -