实验4JPEG压缩编解码的实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四JPEG压缩编解码的实现
实验目的:
使学生掌握DIB文件和JPEG文件的读写过程,能够在程序中打开DIB文件或JPEG文件,可以进行DIB文件和JPEG文件之间的格式转换。
实验环境:
具有多媒体处理功能的计算安装有Windows操作系统,安装有Visual c++6.0程序设计软件。
实验要求:
学习相关理论指导,掌握相关程序设计知识;按照实验步骤要求完成程序设计任务,书写实验报告,试验报告中要求包含程序实现的主要程序代码。
实验内容和实验步骤:
1)创建基于单文档的应用程序:RWJpegExp,并支持窗口滚动
2)为项目添加CJpeg类和jpeglib2库文件
3)通过“Project/Settings…”菜单,选中Link选项卡如下设置:
4)利用ClassWaizard重载CwinApp的OnFileOpen()函数。
void CRWJpegExpApp::OnFileOpen()
{
// TODO: Add your command handler code here
CString szOpenFilter = "图象文件|*.bmp; *.dib; *.jpg; *.jpe; *.jpeg; |位图文件(*.bmp;*.dib)|*.bmp; *.dib|JPEG文件(*.jpg;*.jpe;*.jpeg)|*.jpg; *.jpe; *.jpeg|All Files (*.*)|*.*||";
CFileDialog FileDlg(TRUE, "*.bmp", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szOpenFilter);
if (FileDlg.DoModal() == IDOK)
OpenDocumentFile(FileDlg.m_ofn.lpstrFile);
}
5)利用ClassWaizard重载CRWJpegExpDoc类的的OnOpenDocument()函数。BOOL CRWJpegExpDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
char fname[_MAX_FNAME];
char ext[_MAX_EXT];
_splitpath((LPCSTR)lpszPathName, drive, dir, fname, ext);
if (! stricmp(ext, ".jpg") ||
! stricmp(ext, ".jpe") ||
! stricmp(ext, ".jpeg") ) // JPEG file
{
CJpeg jpeg;
if (! jpeg.Load(lpszPathName))
return FALSE;
HDIB hDIB = CopyHandle(jpeg.GetDib()->GetHandle());
if (hDIB == NULL)
return FALSE;
m_pDib->Attach(hDIB);
return TRUE;
}
return CDocument::OnOpenDocument(lpszPathName);
}
上述代码,应用程序已具备读取JPEG文件、将其解码并显示的功能。
6)利用ClassWaizard为CRWJpegExpDoc类添加一个相应ID——FILE——SA VE——AS命令的消息映射函数CRWJpegExpDoc::OnFileSaveAs()函数。
void CRWJpegExpDoc::OnFileSaveAs()
{
// TODO: Add your command handler code here
CString szSaveFilter= "单色位图(*.bmp;*.dib)|*.bmp; *.dib|16色位图(*.bmp;*.dib)|*.bmp; *.dib|256色位图(*.bmp;*.dib)|*.bmp; *.dib|24位位图(*.bmp;*.dib)|*.bmp; *.dib|JPEG文件(*.jpg;*.jpe;*.jpeg)|*.jpg; *.jpe; *.jpeg|All Files (*.*)|*.*||";
CFileDialog FileDlg(FALSE, "*.bmp", NULL, OFN_HIDEREADONL Y | OFN_OVERWRITEPROMPT, szSaveFilter);
CString strPathName = GetPathName();
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
char fname[_MAX_FNAME];
char ext[_MAX_EXT];
_splitpath((LPCSTR)strPathName, drive, dir, fname, ext);
if (! stricmp(ext, ".jpg") ||
! stricmp(ext, ".jpe") ||
! stricmp(ext, ".jpeg") ) // JPEG file
FileDlg.m_ofn.nFilterIndex = 5;
else
{
switch (m_pDib->GetBitCount())
{
case 1:
FileDlg.m_ofn.nFilterIndex = 1;