计算机图形学 实验二Word文件下载.docx

上传人:b****8 文档编号:22297609 上传时间:2023-02-03 格式:DOCX 页数:37 大小:633.90KB
下载 相关 举报
计算机图形学 实验二Word文件下载.docx_第1页
第1页 / 共37页
计算机图形学 实验二Word文件下载.docx_第2页
第2页 / 共37页
计算机图形学 实验二Word文件下载.docx_第3页
第3页 / 共37页
计算机图形学 实验二Word文件下载.docx_第4页
第4页 / 共37页
计算机图形学 实验二Word文件下载.docx_第5页
第5页 / 共37页
点击查看更多>>
下载资源
资源描述

计算机图形学 实验二Word文件下载.docx

《计算机图形学 实验二Word文件下载.docx》由会员分享,可在线阅读,更多相关《计算机图形学 实验二Word文件下载.docx(37页珍藏版)》请在冰豆网上搜索。

计算机图形学 实验二Word文件下载.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1