VC数字图像处理实验VC单文档精品版.docx
- 文档编号:26948479
- 上传时间:2023-06-24
- 格式:DOCX
- 页数:79
- 大小:2.79MB
VC数字图像处理实验VC单文档精品版.docx
《VC数字图像处理实验VC单文档精品版.docx》由会员分享,可在线阅读,更多相关《VC数字图像处理实验VC单文档精品版.docx(79页珍藏版)》请在冰豆网上搜索。
VC数字图像处理实验VC单文档精品版
数字图像处理
实验指导书
山东大学威海分校机电与信息工程学院
2012年3月
概述
实验项目:
数字图像处理程序编程
运行环境:
WindowsXP/7
编程工具:
VisualC++6.0
主要内容:
(1)建立程序框架,实现图像的读取、保存、显示;
(2)编写颜色处理、几何变换、平滑锐化等图像处理代码,并实现其调用;
(3)自行编写实现扩展的图像处理功能。
第一节建立程序框架
预备工作:
在本机的硬盘上以自己完整的学号和姓名建立一个文件夹。
上机编程的内容全部保存在该文件夹中。
每次下机前将该文件夹拷贝到网络服务器上本班的文件夹中;下次上机时再从服务器上将文件夹拷贝到本机。
1.新建应用程序
1.1运行VisualC++6.0;
1.2点击菜单“文件——新建”,打开“新建”对话框(Ctrl+N);
点击“工程”选项页;选中“MFCAppWizard(exe)”;在“位置”编辑框中选中自己所建立的文件夹;在“工程名称”编辑框中输入DIPXXX,其中XXX为自己姓名的拼音缩写和学号,如DIPJQ;按“确定”按钮,进入向导过程。
2.应用程序向导
步骤1:
选择“单文档”,其它不变,
步骤2:
不作改变,点击“下一步”;
步骤3:
不作改变,
步骤4:
按下“高级”按钮,在“文件扩展名”编辑框中输入bmp,关闭;点击“下一步”;
步骤5:
选择“作为静态的DLL”,点击“下一步”;
步骤6:
将CDIPJQView类的基类选择为CScrollView,其它不变,点击“完成”。
点击“确定”。
3.应用程序框架及基本操作
在完成向导过程后,将建立一套应用程序框架,该框架中包含如下几个类:
CDIPJQApp——应用程序类
CMainFrame——主窗口框架类
CDIPJQDoc——文档类
CDIPJQView——视图类
CAboutDlg——关于对话框类
(其中JQ应换为自己姓名的拼音缩写和学号,后同)
每个类都有一个类定义文件.h,和类实现文件.cpp。
在VC主界面左侧的组合窗口中,切换到“ClassViev”选项页,点击展开“DIPJQClasses”,将列出该应用程序的所有类。
双击某个类,将在编辑窗口中打开该类的.h文件;点击展开类,双击类中已实现的某个成员函数,将打开该类的.cpp文件。
4.修改“关于”对话框
在VC主界面左侧的组合窗口中,切换到“ResourceView”选项页,展开“DIPJQresources”,展开“Dialog”,双击“IDD_ABOUTBOX”,对“关于”对话框进行编辑,在“版权所有(C)2009”之前加上自己的学号和姓名,然后保存。
5.组建和运行程序
点击菜单“组建——组建”,或点击相应的工具条按钮(F7),生成可执行程序(exe);
点击菜单“组建—执行”,或点击相应的工具条按钮(Ctrl+F5),运行该程序,在程序中打开“关于”对话框。
第二节建立图像类
1.建立类文件
点击菜单“插入—类”,打开“新建类”对话框;在类的类型中选中“GenericClass”;在名称中输入“SDImage”;确定。
建立起SDImage类的头文件SDImage.h和源文件SDImage.cpp。
2.编写类定义代码
打开SDImage.h文件,将SDImage类的定义代码添加到该头文件中(灰底部分为文件中已有的代码,后同):
classSDImage
{
public:
BOOLCopyFrom(SDImage*a_pImg);
BOOLCreate(inta_Width,inta_Height);
intFitBlt(HDCa_DestDC,inta_DestX,inta_DestY,inta_DestWidth,inta_DestHeight,inta_SrcX,inta_SrcY,inta_SrcWidth,inta_SrcHeight,DWORDa_Rop=SRCCOPY);
BOOLStretchBlt(HDCa_DestDC,inta_DestX,inta_DestY,inta_DestWidth,inta_DestHeight,inta_SrcX,inta_SrcY,inta_SrcWidth,inta_SrcHeight,DWORDa_Rop=SRCCOPY);
BOOLBitBlt(HDCa_DestDC,inta_DestX,inta_DestY,inta_Width,inta_Height,inta_SrcX,inta_SrcY,DWORDa_Rop=SRCCOPY);
BOOLSaveBitmap(CStringa_Filename);
BOOLIsValid();
voidDestroy();
CDCm_DC;
BYTE*m_pBits;
intm_ImageSize;
intm_WidthBytes;
intm_Height;
BOOLLoadBmpFile(CStringa_Filename);
intm_Width;
SDImage();
virtual~SDImage();
protected:
HDCm_hMemDC;
HBITMAPm_hBitmap;
private:
HBITMAPm_hOldBitmap;
};
#endif//!
defined(AFX_SDIMAGE_H__BA98791A_D437_4687_AAEA_B988391C2FCC__INCLUDED_)
***添加成员变量和成员函数
右键单击左侧类中SDImage类,选择添加成员变量。
右键单击左侧类中SDImage类,选择添加成员函数。
3.编写类实现代码
打开SDImage.cpp文件,将SDImage类的实现代码添加到该文件中。
(1)构造及析构函数
SDImage:
:
SDImage()
{
m_hBitmap=NULL;
m_pBits=NULL;
m_hMemDC=NULL;
}
SDmage:
:
~SDmage()
{
Destroy();
}
(2)图像空间创建函数
按给定的图像尺寸分配图像的内存空间,并定义相关参数。
BOOLSDImage:
:
Create(inta_Width,inta_Height)
{
Destroy();
if(a_Width==0||a_Height==0)returnFALSE;
if(a_Width<0)a_Width=-a_Width;
if(a_Height<0)a_Height=-a_Height;
BITMAPINFObi;
bi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
bi.bmiHeader.biWidth=a_Width;
bi.bmiHeader.biHeight=-a_Height;
bi.bmiHeader.biPlanes=1;
bi.bmiHeader.biBitCount=24;
bi.bmiHeader.biCompression=BI_RGB;
bi.bmiHeader.biSizeImage=0;
bi.bmiHeader.biXPelsPerMeter=11810;
bi.bmiHeader.biYPelsPerMeter=11810;
bi.bmiHeader.biClrUsed=0;
bi.bmiHeader.biClrImportant=0;
HDChdc=CreateCompatibleDC(NULL);
m_hBitmap=CreateDIBSection(hdc,&bi,DIB_RGB_COLORS,(void**)&m_pBits,NULL,0);
DeleteDC(hdc);
if(m_hBitmap==NULL||m_pBits==NULL)
{
m_hBitmap=NULL;
m_pBits=NULL;
returnFALSE;
}
BITMAPbm;
GetObject(m_hBitmap,sizeof(BITMAP),&bm);
m_Width=bm.bmWidth;
m_Height=bm.bmHeight;
m_WidthBytes=bm.bmWidthBytes;
m_ImageSize=m_WidthBytes*m_Height;
m_hMemDC=CreateCompatibleDC(NULL);
if(m_hMemDC==NULL)
{
DeleteObject(m_hBitmap);
m_hBitmap=NULL;
m_pBits=NULL;
m_hMemDC=NULL;
returnFALSE;
}
m_hOldBitmap=(HBITMAP)SelectObject(m_hMemDC,m_hBitmap);
m_DC.Attach(m_hMemDC);
returnTRUE;
}
(3)图像空间释放函数
voidSDImage:
:
Destroy()
{
if(m_hBitmap!
=NULL&&m_pBits!
=NULL&&m_hMemDC!
=NULL)
{
m_DC.Detach();
SelectObject(m_hMemDC,m_hOldBitmap);
DeleteDC(m_hMemDC);
DeleteObject(m_hBitmap);
}
m_hBitmap=NULL;
m_pBits=NULL;
m_hMemDC=NULL;
}
(4)图像有效性判别及图像复制函数
BOOLSDImage:
:
IsValid()
{
return(m_hBitmap!
=NULL&&m_pBits!
=NULL&&m_hMemDC!
=NULL);
}
BOOLSDImage:
:
CopyFrom(SDImage*a_pImg)
{
if(a_pImg==NULL||!
a_pImg->IsValid())
returnFALSE;
if(!
Create(a_pImg->m_Width,a_pImg->m_Height))
returnFALSE;
memcpy((void*)m_pBits,(void*)a_pImg->m_pBits,m_WidthBytes*m_Height);
returnTRUE;
}
(5)图像显示函数
直接显示,缩放显示,按适合窗口的尺寸显示图像。
BOOLSDImage:
:
BitBlt(HDCa_DestDC,inta_DestX,inta_DestY,inta_Width,inta_Height,inta_SrcX,inta_SrcY,DWORDa_Rop)
{
return:
:
BitBlt(a_DestDC,a_DestX,a_DestY,a_Width,a_Height,m_hMemDC,a_SrcX,a_SrcY,a_Rop)
}
BOOLSDImage:
:
StretchBlt(HDCa_DestDC,inta_DestX,inta_DestY,inta_DestWidth,inta_DestHeight,inta_SrcX,inta_SrcY,inta_SrcWidth,inta_SrcHeight,DWORDa_Rop)
{
:
:
SetStretchBltMode(a_DestDC,COLORONCOLOR);
return:
:
StretchBlt(a_DestDC,a_DestX,a_DestY,a_DestWidth,a_DestHeight,m_hMemDC,a_SrcX,a_SrcY,a_SrcWidth,a_SrcHeight,a_Rop);
}
(6)Bmp文件读入函数
BOOLSDImage:
:
LoadBmpFile(CStringa_Filename)
{
FILE*pf=fopen(a_Filename,"rb");
if(pf==NULL)returnFALSE;
BITMAPFILEHEADERbmfHeader;
if(fread((LPSTR)&bmfHeader,1,sizeof(bmfHeader),pf)!
=sizeof(bmfHeader))
{fclose(pf);returnFALSE;}
if(bmfHeader.bfType!
=((WORD)('M'<<8)|'B'))
{fclose(pf);returnFALSE;}
intleng=bmfHeader.bfSize-sizeof(bmfHeader);
BYTE*pBmp=(BYTE*)calloc(leng,1);
if(pBmp==NULL)
{fclose(pf);returnFALSE;}
if((int)fread(pBmp,1,leng,pf)!
=leng)
{
free(pBmp);fclose(pf);
returnFALSE;
}
fclose(pf);
BYTE*pImg=(BYTE*)(pBmp+bmfHeader.bfOffBits-sizeof(BITMAPFILEHEADER));
BITMAPINFO*pbi;
pbi=(BITMAPINFO*)pBmp;
if(pbi->bmiHeader.biBitCount!
=24)
{free(pBmp);returnFALSE;}
intwidthBytes=((pbi->bmiHeader.biWidth*pbi->bmiHeader.biBitCount+31)/32)*4;
inti;
BYTE*p1,*p2;
RGBQUAD*ci=pbi->bmiColors;
if(Create(pbi->bmiHeader.biWidth,abs(pbi->bmiHeader.biHeight)))
{
intbytes=m_WidthBytes;
if(bytes>widthBytes)bytes=widthBytes;
for(i=0;i { p1=m_pBits+i*m_WidthBytes; if(pbi->bmiHeader.biHeight<0) p2=pImg+i*widthBytes; else p2=pImg+(m_Height-1-i)*widthBytes; memcpy(p1,p2,bytes); } free(pBmp);returnTRUE; } else {free(pBmp);returnFALSE;} } (7)Bmp文件保存函数 BOOLSDImage: : SaveBitmap(CStringa_Filename) { if(! IsValid())returnFALSE; FILE*pf=fopen(a_Filename,"wb"); if(pf==NULL)returnFALSE; BITMAPINFO*pbmi; pbmi=(BITMAPINFO*)calloc(1,sizeof(BITMAPINFOHEADER)); pbmi->bmiHeader.biSize=sizeof(BITMAPINFOHEADER); pbmi->bmiHeader.biWidth=m_Width; pbmi->bmiHeader.biHeight=m_Height; pbmi->bmiHeader.biPlanes=1; pbmi->bmiHeader.biBitCount=24; pbmi->bmiHeader.biCompression=BI_RGB; UINTwidthBytes=((m_Width*24+31)/32)*4; pbmi->bmiHeader.biSizeImage=widthBytes*m_Height; pbmi->bmiHeader.biXPelsPerMeter=11810; pbmi->bmiHeader.biYPelsPerMeter=11810; pbmi->bmiHeader.biClrUsed=0; pbmi->bmiHeader.biClrImportant=0; BITMAPFILEHEADERhdr; BITMAPINFOHEADER*pbih; pbih=(BITMAPINFOHEADER*)pbmi; hdr.bfType=0x4d42;//0x42="B"0x4d="M" hdr.bfSize=(DWORD)(sizeof(BITMAPFILEHEADER)+ pbih->biSize+pbih->biSizeImage); hdr.bfReserved1=0; hdr.bfReserved2=0; hdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+pbih->biSize; fwrite(&hdr,sizeof(BITMAPFILEHEADER),1,pf); fwrite(pbih,sizeof(BITMAPINFOHEADER),1,pf); inti; BYTE*p1; for(i=m_Height-1;i>=0;i--) { p1=m_pBits+m_WidthBytes*i; if(fwrite(p1,1,widthBytes,pf)! =widthBytes) {free((HLOCAL)pbmi);fclose(pf);returnFALSE;} } free((HLOCAL)pbmi); fclose(pf); returnTRUE; } 4.组建程序 在SDImage.cpp处于当前编辑窗口时,点击菜单“组建—编译”,或点击相应的工具栏图标,对SDImage.cpp进行编译。 在VC主界面下侧的组合窗口中将显示编译的状态。 当编译中出现错误时,按F4键将依次定位到源程序的错误处,请检查并改正错误。 第四节定义图像文档实现图像读/写 1.添加头文件 在DIPJQ.h文件中添加如下一行代码: (其中灰色部分为程序中已有的代码,后同) #include"resource.h"//mainsymbols #include"SDImage.h" 2.定义图像类指针 在DIPJQDoc.h文件中添加如下一行代码: //Attributes public: classSDImage*m_pCurImage,*m_pLastImage; 注: 定义两个图像类的指针,以使程序具备对最近一次处理的恢复功能。 3.图像对象的建立和释放 在“ClassView”选项页中,点击展开“CDIPJQDoc”,双击“CDIPJQDoc()”,打开DIPJQDoc.cpp文件,在文件中修改添加如下代码: CDIPJQDoc: : CDIPJQDoc() { //TODO: addone-timeconstructioncodehere m_pCurImage=newSDImage; m_pLastImage=newSDImage; } CDIPJQDoc: : ~CDIPJQDoc() { deletem_pCurImage; deletem_pLastImage; } 4.进行消息映射 点击菜单“查看—建立类向导”,打开“MFCClassWizard”对话框(Ctrl+w)。 在“ClassName”下拉框中选中“CDIPJQDoc”,在“ObjectIDs”列表框中选中“CDIPJQDoc”,然后在“Messgaes”列表框中,选中“OnOpenDocument”并双击,建立起相应的消息映射函数;再选中“OnSaveDocument”双击。 在“ObjectIDs”列表框中选中“ID_EDIT_UNDO”,然后在“Message”列表框中双击“COMMAND”,建立起相应的消息映射函数。 5.添加消息映射函数代码 在“ClassView”选项页中,点击展开“CDIPJQDoc”,双击“OnOpenDocument(LPCTSTRlpszPathName)”,打开DIPJQDoc.cpp文件,在文件中添加如下代码: BOOLCDIPJQDoc: : OnOpenDocument(LPCTSTRlpszPathName) { if(! CDocument: : OnOpenDocument(lpszPathName)) returnFALSE; //TODO: Addyourspecializedcreationcodehere returnm_pCurImage->LoadBmpFile(lpszPathName); } BOOLCDIPJQDoc: : OnSaveDocument(LPCTSTRlpszPathName) { //TODO: Addyourspecializedcodehereand/orcallthebaseclass returnm_pCurImage->SaveBitmap(lpszPathName); } voidCDIPJQDoc: : OnEditUndo() { //TODO: Addyourcommandhandlercodehere if(m_pCurImage->IsValid()&&m_pLastImage->IsValid()) { SDImage*p=m_pCurImage; m_pCurImage=m_pL
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 数字图像 处理 实验 文档 精品