计算机图形学 实验二Word文件下载.docx
- 文档编号:22297609
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:37
- 大小:633.90KB
计算机图形学 实验二Word文件下载.docx
《计算机图形学 实验二Word文件下载.docx》由会员分享,可在线阅读,更多相关《计算机图形学 实验二Word文件下载.docx(37页珍藏版)》请在冰豆网上搜索。
DIBAPI.H和DIBAPI.CPP,在其中实现对BMP文件的大部分处理。
在工作区“FileView”选项卡的“HeaderFiles”中点右键,在“添加文件到目录”添加“DIBAPI.H”文件。
如下图2-3所示:
图2-3
在工作区“FileView”选项卡的“SourceFiles”中点右键,在“添加文件到目录”添加“DIBAPI.CPP”文件。
并在“ReadBMPDoc.h”添加头文件"
dibapi.h"
,如下所示:
#include"
4.在CReadBMPDoc类中添加保护成员变量CPalette*m_palDIB,HDIBm_hDIB和CSizem_sizeDoc。
m_hDIB用于保存当前BMP图像句柄,m_palDIB用于指向BMP图像对应的调色板。
protected:
HDIBm_hDIB;
CPalette*m_palDIB;
CSizem_sizeDoc;
5.为了取得保存在当前文档中的HDIB和Palette数据,在“ReadBMPDoc.h”的CReadBMPDoc类中添加方法:
GetHDIB,GetDocPalette和GDocSize。
如下所示:
//Attributes
public:
HDIBGetHDIB()const
{returnm_hDIB;
}
CPalette*GetDocPalette()const
{returnm_palDIB;
CSizeGetDocSize()const
{returnm_sizeDoc;
在CReadBMPDoc.cpp的构造函数中初始化:
//初始化变量
m_hDIB=NULL;
m_palDIB=NULL;
m_sizeDoc=CSize(1,1);
6.响应类CReadBMPDocOnOpenDocument事件,以实现打开文件的操作。
从View|ClassWizard进入MFCClassWizard界面,在MessageMaps选项中完成消息映射。
下图2-4所示:
图2-4
在BOOLCReadBMPDoc:
:
OnOpenDocument(LPCTSTRlpszPathName)函数中添加如下代码:
//if(!
CDocument:
OnOpenDocument(lpszPathName))
//returnFALSE;
//TODO:
Addyourspecializedcreationcodehere
//returnTRUE;
CFilefile;
CFileExceptionfe;
//打开文件
if(!
file.Open(lpszPathName,CFile:
modeRead|CFile:
shareDenyWrite,&
fe))
{
//失败
ReportSaveLoadException(lpszPathName,&
fe,
FALSE,AFX_IDP_FAILED_TO_OPEN_DOC);
//返回FALSE
returnFALSE;
DeleteContents();
//更改光标形状
BeginWaitCursor();
//尝试调用ReadDIBFile()读取图像
TRY
m_hDIB=:
ReadDIBFile(file);
CATCH(CFileException,eLoad)
//读取失败
file.Abort();
//恢复光标形状
EndWaitCursor();
//报告失败
ReportSaveLoadException(lpszPathName,eLoad,
//设置DIB为空
m_hDIB=NULL;
END_CATCH
//初始化DIB
InitDIBData();
//恢复光标形状
EndWaitCursor();
//判断读取文件是否成功
if(m_hDIB==NULL)
//失败,可能非BMP格式
CStringstrMsg;
strMsg="
读取图像时出错!
可能是不支持该类型的图像文件!
"
;
//提示出错
MessageBox(NULL,strMsg,"
系统提示"
MB_ICONINFORMATION|MB_OK);
//设置文件名称
SetPathName(lpszPathName);
//初始化胀标记为FALSE
SetModifiedFlag(FALSE);
//返回TRUE
returnTRUE;
并在ReadBMPDoc.cpp添加Public成员函数InitDIBData,并添加如下程序:
voidCReadBMPDoc:
InitDIBData()
{
//初始化DIB对象
//判断调色板是否为空
if(m_palDIB!
=NULL)
//删除调色板对象
deletem_palDIB;
//重置调色板为空
m_palDIB=NULL;
//如果DIB对象为空,直接返回
//返回
return;
LPSTRlpDIB=(LPSTR):
GlobalLock((HGLOBAL)m_hDIB);
//判断图像是否过大
if(:
DIBWidth(lpDIB)>
INT_MAX||:
DIBHeight(lpDIB)>
INT_MAX)
:
GlobalUnlock((HGLOBAL)m_hDIB);
//释放DIB对象
GlobalFree((HGLOBAL)m_hDIB);
BMP图像太大!
//提示用户
//设置文档大小
m_sizeDoc=CSize((int):
DIBWidth(lpDIB),(int):
DIBHeight(lpDIB));
:
//创建新调色板
m_palDIB=newCPalette;
//判断是否创建成功
if(m_palDIB==NULL)
//失败,可能是内存不足
//设置DIB对象为空
//调用CreateDIBPalette来创建调色板
CreateDIBPalette(m_hDIB,m_palDIB)==NULL)
//返回空,可能该DIB对象没有调色板
//删除
//设置为空
}
7.完成图片的打开操作之后,图片的数据就已经被保存在程序中,为了将图片显示出来还需要响应类CReadBMPView的OnDraw事件,在其中完成图像显示。
voidCReadBMPView:
OnDraw(CDC*pDC)
//CReadBMPDoc*pDoc=GetDocument();
//ASSERT_VALID(pDoc);
adddrawcodefornativedatahere
//显示等待光标
//获取文档
CReadBMPDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//获取DIB
HDIBhDIB=pDoc->
GetHDIB();
//判断DIB是否为空
if(hDIB!
LPSTRlpDIB=(LPSTR):
GlobalLock((HGLOBAL)hDIB);
//获取DIB宽度
intcxDIB=(int):
DIBWidth(lpDIB);
//获取DIB高度
intcyDIB=(int):
DIBHeight(lpDIB);
GlobalUnlock((HGLOBAL)hDIB);
CRectrcDIB;
rcDIB.top=rcDIB.left=0;
rcDIB.right=cxDIB;
rcDIB.bottom=cyDIB;
CRectrcDest;
//判断是否是打印
if(pDC->
IsPrinting())
{
//是打印,计算输出图像的位置和大小,以便符合页面
//获取打印页面的水平宽度(象素)
intcxPage=pDC->
GetDeviceCaps(HORZRES);
//获取打印页面的垂直高度(象素)
intcyPage=pDC->
GetDeviceCaps(VERTRES);
//获取打印机每英寸象素数
intcxInch=pDC->
GetDeviceCaps(LOGPIXELSX);
intcyInch=pDC->
GetDeviceCaps(LOGPIXELSY);
//计算打印图像大小(缩放,根据页面宽度调整图像大小)
rcDest.top=rcDest.left=0;
rcDest.bottom=(int)(((double)cyDIB*cxPage*cyInch)
/((double)cxDIB*cxInch));
rcDest.right=cxPage;
//计算打印图像位置(垂直居中)
inttemp=cyPage-(rcDest.bottom-rcDest.top);
rcDest.bottom+=temp/2;
rcDest.top+=temp/2;
}
else
//非打印
//不必缩放图像
rcDest=rcDIB;
//输出DIB
PaintDIB(pDC->
m_hDC,&
rcDest,pDoc->
GetHDIB(),
&
rcDIB,pDoc->
GetDocPalette());
//恢复正常光标
}
8.编译、调试并运行程序,自此一个用于打开BMP图像的单文档视图结构的程序就完成了。
通过修改当前位图句柄m_hDIB中存放像素的数据就可以对图像进行改变了。
9.在项目中导入专门处理BMP几何变换的文件:
GeoTrans.H和GeoTrans.CPP。
并在ReadBMPView.cpp文件中添加:
GeoTrans.h"
打开“ResourceView”对菜单进行修改,添加“几何变换”菜单项。
添加“图像平移”子菜单,ID为“ID_Geo_Trans”。
在“CReadBMPView”中建立名为“OnGeoTrans”的“OnCommand”函数。
OnGeoTrans()
Addyourcommandhandlercodehere
//平移位图
//CCh1_1Doc*pDoc=GetDocument();
//指向DIB的指针
LPSTRlpDIB;
//指向DIB象素指针
LPSTRlpDIBBits;
//锁定DIB
lpDIB=(LPSTR):
GlobalLock((HGLOBAL)pDoc->
GetHDIB());
//判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的平移,其它的可以类推)
DIBNumColors(lpDIB)!
=256)
MessageBox("
目前只支持256色位图的平移!
"
MB_ICONINFORMATION|MB_OK);
//解除锁定
GlobalUnlock((HGLOBAL)pDoc->
LONGlXOffset;
LONGlYOffset;
//创建对话框
//CDlgGeoTrandlgPara;
//初始化变量值
//dlgPara.m_XOffset=100;
//dlgPara.m_YOffset=100;
//显示对话框,提示用户设定平移量
//if(dlgPara.DoModal()!
=IDOK)
//{
//return;
//}
//获取用户设定的平移量
lXOffset=100;
lYOffset=100;
//删除对话框
//deletedlgPara;
//找到DIB图像象素起始位置
lpDIBBits=:
FindDIBBits(lpDIB);
//调用TranslationDIB()函数平移DIB
if(TranslationDIB1(lpDIBBits,:
DIBWidth(lpDIB),:
DIBHeight(lpDIB),lXOffset,lYOffset))
//设置脏标记
pDoc->
SetModifiedFlag(TRUE);
//更新视图
UpdateAllViews(NULL);
else
分配内存失败!
//解除锁定
//恢复光标
10.在“几何变换”菜单项中添加“垂直镜像”子菜单,ID为“ID_Geo_MirV”。
在“CReadBMPView”中建立名为“OnGeoMirV”的“OnCommand”函数。
voidCReadBMPView:
OnGeoMirV()
//垂直镜像
//判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的垂直镜像,其它的可以类推)
目前只支持256色位图的垂直镜像!
//调用MirrorDIB()函数垂直镜像DIB
if(MirrorDIB(lpDIBBits,:
DIBHeight(lpDIB),FALSE))
11.在“几何变换”菜单项中添加“水平镜像”子菜单,ID为“ID_Geo_MirH”。
在“CReadBMPView”中建立名为“OnGeoMirH”的“OnCommand”函数。
OnGeoMirH()
//水平镜像
//判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的水平镜像,其它的可以类推)
目前只支持256色位图的水平镜像!
//调用MirrorDIB()函数水平镜像DIB
DIBHeight(lpDIB),TRUE))
12.在“几何变换”菜单项中添加“图像转置”子菜单,ID为“ID_Geo_Transpose”。
在“CReadBMPView”中建立名为“OnGeoTranspose”的“OnCommand”函数。
OnGeoTranspose()
//TOD
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机图形学 实验二 计算机 图形学 实验