图象的几何变换Word文档格式.docx
《图象的几何变换Word文档格式.docx》由会员分享,可在线阅读,更多相关《图象的几何变换Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
![图象的几何变换Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-11/29/91b01a12-05c5-45e0-b744-6c354f53187f/91b01a12-05c5-45e0-b744-6c354f53187f1.gif)
//CDlgGeoTrandialog
classCDlgGeoTran:
publicCDialog
{//Construction
public:
CDlgGeoTran(CWnd*pParent=NULL);
//standardconstructor
//DialogData
//{{AFX_DATA(CDlgGeoTran)
enum{IDD=IDD_DLG_GEOTrans};
longm_XOffset;
longm_YOffset;
//}}AFX_DATA
//Overrides
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);
//DDX/DDVsupport
//Implementation
protected:
DECLARE_MESSAGE_MAP()
};
//DlgGeoTran.cpp:
implementationfile
CDlgGeoTran:
:
CDlgGeoTran(CWnd*pParent/*=NULL*/)
CDialog(CDlgGeoTran:
IDD,pParent)
{
//{{AFX_DATA_INIT(CDlgGeoTran)
m_XOffset=0;
m_YOffset=0;
//}}AFX_DATA_INIT
}
voidCDlgGeoTran:
DoDataExchange(CDataExchange*pDX)
{CDialog:
DoDataExchange(pDX);
DDX_Text(pDX,IDC_EDIT_XOffset,m_XOffset);
DDX_Text(pDX,IDC_EDIT_YOffset,m_YOffset);
3)设置图像缩放参数。
在资源视图中添加对话框如下图,然后进行相应的资源参数设置。
添加对话框类【CDlgGeoZoom】,具体代码如下所示:
//DlgGeoZoom.h:
//CDlgGeoZoomdialog
classCDlgGeoZoom:
CDlgGeoZoom(CWnd*pParent=NULL);
//standardconstructor
enum{IDD=IDD_DLG_GEOZoom};
floatm_XZoom;
floatm_YZoom;
DECLARE_MESSAGE_MAP()
//DlgGeoZoom.cpp:
CDlgGeoZoom:
CDlgGeoZoom(CWnd*pParent/*=NULL*/)
CDialog(CDlgGeoZoom:
{//{{AFX_DATA_INIT(CDlgGeoZoom)
m_XZoom=0.0f;
m_YZoom=0.0f;
voidCDlgGeoZoom:
CDialog:
//{{AFX_DATA_MAP(CDlgGeoZoom)
DDX_Text(pDX,IDC_EDIT_XZoom,m_XZoom);
DDV_MinMaxFloat(pDX,m_XZoom,0.25f,4.f);
DDX_Text(pDX,IDC_EDIT_YZoom,m_YZoom);
DDV_MinMaxFloat(pDX,m_YZoom,0.25f,4.f);
//}}AFX_DATA_MAP
4)设置图像旋转参数。
添加对话框类【CDlgGeoRota】,具体代码如下所示:
//DlgGeoRota.cpp:
CDlgGeoRota:
CDlgGeoRota(CWnd*pParent/*=NULL*/)
CDialog(CDlgGeoRota:
m_iRotateAngle=0;
voidCDlgGeoRota:
DDX_Text(pDX,IDC_EDIT_Rotate,m_iRotateAngle);
DDV_MinMaxInt(pDX,m_iRotateAngle,0,360);
5)添加菜单资源项如下图所示。
然后添加消息,具体代码如下所示:
//图像平移
voidCCh1_1View:
OnGeomTran()
//平移位图
//获取文档
CCh1_1Doc*pDoc=GetDocument();
//指向DIB的指针
LPSTRlpDIB;
//指向DIB象素指针
LPSTRlpDIBBits;
//锁定DIB
lpDIB=(LPSTR):
GlobalLock((HGLOBAL)pDoc->
GetHDIB());
//判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的平移,其它的可以类推)
if(:
DIBNumColors(lpDIB)!
=256)
{//提示用户
MessageBox("
目前只支持256色位图的平移!
"
"
系统提示"
MB_ICONINFORMATION|MB_OK);
//解除锁定
GlobalUnlock((HGLOBAL)pDoc->
return;
LONGlXOffset;
LONGlYOffset;
//创建对话框
CDlgGeoTrandlgPara;
//初始化变量值
dlgPara.m_XOffset=100;
dlgPara.m_YOffset=100;
//显示对话框,提示用户设定平移量
if(dlgPara.DoModal()!
=IDOK)
//获取用户设定的平移量
lXOffset=dlgPara.m_XOffset;
lYOffset=dlgPara.m_YOffset;
//删除对话框
deletedlgPara;
//更改光标形状
BeginWaitCursor();
//找到DIB图像象素起始位置
lpDIBBits=:
FindDIBBits(lpDIB);
//调用TranslationDIB()函数平移DIB
if(TranslationDIB1(lpDIBBits,:
DIBWidth(lpDIB),:
DIBHeight(lpDIB),lXOffset,lYOffset))
{//设置标记
pDoc->
SetModifiedFlag(TRUE);
/更新视图
UpdateAllViews(NULL);
else
分配内存失败!
//恢复光标
EndWaitCursor();
//图像缩放
OnGeomZoom()
{//获取文档
//判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的缩放,其它的可以类推)
{//提示用户
目前只支持256色位图的缩放!
//缩放比率
floatfXZoomRatio;
floatfYZoomRatio;
CDlgGeoZoomdlgPara;
dlgPara.m_XZoom=0.5;
dlgPara.m_YZoom=0.5;
{
fXZoomRatio=dlgPara.m_XZoom;
fYZoomRatio=dlgPara.m_YZoom;
//创建新DIB
HDIBhNewDIB=NULL;
//调用ZoomDIB()函数转置DIB
hNewDIB=(HDIB)ZoomDIB(lpDIB,fXZoomRatio,fYZoomRatio);
//判断缩放是否成功
if(hNewDIB!
=NULL)
//替换DIB,同时释放旧DIB对象
ReplaceHDIB(hNewDIB);
//更新DIB大小和调色板
InitDIBData();
//设置脏标记
//重新设置滚动视图大小
SetScrollSizes(MM_TEXT,pDoc->
GetDocSize());
//更新视图
//提示用户
//图像旋转
OnGeomRota()
{//获取文档
//判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的旋转,其它的可以类推)
目前只支持256色位图的旋转!
intiRotateAngle;
CDlgGeoRotadlgPara;
dlgPara.m_iRotateAngle=90;
//显示对话框,提示用户设定旋转角度
{//返回
iRotateAngle=dlgPara.m_iRotateAngle;
//调用RotateDIB()函数旋转DIB
hNewDIB=(HDIB)RotateDIB(lpDIB,iRotateAngle);
//判断旋转是否成功
{//提示用户
4.实验结果
1)图像平移实验结果
图2设置平移量
图3平移结果
2)图像缩放实验结果
图4设定缩放量
图5缩放结果
3)图像旋转实验结果
图6设定旋转角度
图7图像旋转结果
5.实验小结
本次实验完成了图像位移、图像任意角度的旋转、变换的实验内容,但在精度的控制方面还存在缺陷。
另外图像平移、变换等操作的实现程序较为简单,不能完成复杂的操作和处理,而且显示效果方面也有待于修改和改进。