已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五章 图像的几何变换数字图像平移图像平移函数/* * 函数名称:Translation(LPSTR lpSrcStartBits, long lWidth, long lHeight, long lXOffset, long lYOffset,long lLineBytes,long lDstLineBytes) * 函数参数: * LPSTRlpSrcStartBits,指向源DIB起始像素的指针 * longlWidth,DIB图象的宽度 * longlHeight,DIB图象的高度 * longlXOffset,X方向偏移量 * longlYOffset,Y方向偏移量 * longlLineBytes,DIB图象的行字节数,为4的倍数 * longlDstLineBytes,临时DIB图象的行字节数,为4的倍数 * 函数类型:BOOL * 函数功能:该函数用来平移DIB图象 */BOOL Translation(LPSTR lpSrcStartBits, long lWidth, long lHeight, long lXOffset, long lYOffset,long lLineBytes,long lDstLineBytes) long i; /行循环变量long j; /列循环变量LPSTRlpSrcDIBBits;/指向源像素的指针LPSTRlpDstDIBBits;/指向临时图象对应像素的指针LPSTRlpDstStartBits;/指向临时图象对应像素的指针 HLOCALhDstDIBBits;/临时图象句柄hDstDIBBits= LocalAlloc(LHND, lWidth * lDstLineBytes);/ 分配临时内存lpDstStartBits= (char * )LocalLock(hDstDIBBits);/ 锁定内存if (hDstDIBBits= NULL)/ 判断是否内存分配return FALSE;/ 分配内存失败for(i = 0; i lHeight; i+)/ 行for(j = 0; j = 0) & (j-lYOffset= 0) & (i-lXOffset GetHObject();/ 锁定DIBif (pDoc-m_dib.GetColorNum(lpSrcDib) != 256)/ 判断是否是8-bpp位图 AfxMessageBox(对不起,不是256色位图!);/ 警告 :GlobalUnlock(HGLOBAL) pDoc-GetHObject();/ 解除锁定 return;/返回 /判断是否是8-bpp位图,不是则返回lpSrcStartBits=pDoc-m_dib.GetBits(lpSrcDib);/ 找到DIB图象像素起始位置lSrcWidth= pDoc-m_dib.GetWidth(lpSrcDib);/ 获取图象的宽度lSrcHeight= pDoc-m_dib.GetHeight(lpSrcDib);/ 获取图象的高度lSrcLineBytes=pDoc-m_dib.GetReqByteWidth(lSrcWidth * 8);/ 计算图象每行的字节数/lDstLineBytes=pDoc-m_dib.GetReqByteWidth(lSrcHeight * 8);/ 计算新图象每行的字节数CDlgTran TranPara;/ 创建对话框if (TranPara.DoModal() != IDOK)/ 显示对话框,提示用户设定量return;int temver=TranPara.m_verOff;int temhor=TranPara.m_horOff;if (Translation(lpSrcStartBits, lSrcWidth,lSrcHeight,/ 调用Translation()函数平移DIBtemver,temhor,lSrcLineBytes,lDstLineBytes)pDoc-SetModifiedFlag(TRUE);/ 设置脏标记pDoc-UpdateAllViews(NULL);/ 更新视图:GlobalUnlock(HGLOBAL) pDoc-GetHObject();/ 解除锁定elseAfxMessageBox(_T(分配内存失败!);/警告数字图像旋转图像旋转函数/* * 函数名称:Rotate(LPSTR lpSrcDib, LPSTR lpSrcStartBits,long lWidth, long lHeight, long lLineBytes,WORD palSize, long lDstWidth, long lDstHeight,long lDstLineBytes,floatfSina, float fCosa) * 函数参数: * LPSTR lpSrcDib,指向源DIB的指针 * LPSTR lpSrcStartBits,指向源DIB的起始像素的指针 * long lWidth,源DIB图象宽度 * long lHeight,源DIB图象高度 * long lLineBytes,源DIB图象字节宽度(4的倍数) * WORD palSize,源DIB图象调色板大小 * long lDstWidth,目标图象宽度 * long lDstHeight,目标DIB图象高度 * long lDstLineBytes,目标DIB图象行字节数(4的倍数) * floatfSina,旋转角的余弦,说明:为了避免两次求取正余弦,这里作为两个函数参数来用 * float fCosa,旋转角的正弦 * 函数类型:HGLOBAL * 函数功能:用来旋转DIB图象 */HGLOBAL Rotate(LPSTR lpSrcDib, LPSTR lpSrcStartBits,long lWidth, long lHeight, long lLineBytes,WORD palSize, long lDstWidth, long lDstHeight,long lDstLineBytes,floatfSina, float fCosa)float varFloat1; /浮点参数变量1float varFloat2; /浮点参数变量2LPSTRlpDstDib;/指向临时图象的指针long i; /行循环变量long j; /列循环变量long i1; /行循环变量long j1; /列循环变量LPSTRlpSrcDIBBits;/指向源像素的指针LPSTRlpDstDIBBits;/指向临时图象对应像素的指针LPSTRlpDstStartBits;/指向临时图象对应像素的指针 LPBITMAPINFOHEADER lpbmi;/ 指向BITMAPINFOHEADER结构的指针varFloat1= (float) (-0.5 * (lDstWidth - 1) * fCosa - 0.5 * (lDstHeight - 1) * fSina/ 将经常用到的两个常数事先求出,以便作为常数使用+ 0.5 * (lDstWidth - 1);varFloat2= (float) ( 0.5 * (lDstWidth - 1) * fSina - 0.5 * (lDstHeight - 1) * fCosa+ 0.5 * (lDstHeight - 1);HGLOBAL hDIB = (HGLOBAL) :GlobalAlloc(GHND, lDstLineBytes * lDstHeight + *(LPDWORD)lpSrcDib +palSize);/ 分配内存,以保存新DIBif (hDIB = NULL)/ 判断是否是有效的DIB对象return FALSE;/ 不是,则返回lpDstDib= (char * ):GlobalLock(HGLOBAL) hDIB);/ 锁定内存memcpy(lpDstDib,lpSrcDib, *(LPDWORD)lpSrcDib +palSize);/ 复制DIB信息头和调色板lpbmi = (LPBITMAPINFOHEADER)lpDstDib;/ 获取指针lpbmi-biHeight=lDstHeight;/ 更新DIB中图象的高度和宽度lpbmi-biWidth =lDstWidth;lpDstStartBits=lpDstDib+ *(LPDWORD)lpDstDib+palSize;/ 求像素起始位置,作用如同:FindDIBBits(gCo.lpSrcDib),这里尝试使用了这种方法,以避免对全局函数的调用for(i = 0; i lDstHeight; i+)/ 行操作for(j = 0; j = 0) & (j1= 0) & (i1GetHObject();/ 锁定DIBif (pDoc-m_dib.GetColorNum(lpSrcDib) != 256)/ 判断是否是8-bpp位图 AfxMessageBox(对不起,不是256色位图!);/ 警告 :GlobalUnlock(HGLOBAL) pDoc-GetHObject();/ 解除锁定 return;/返回 /判断是否是8-bpp位图,不是则返回lpSrcStartBits=pDoc-m_dib.GetBits(lpSrcDib);/ 找到DIB图象像素起始位置lSrcWidth= pDoc-m_dib.GetWidth(lpSrcDib);/ 获取图象的宽度lSrcHeight= pDoc-m_dib.GetHeight(lpSrcDib);/ 获取图象的高度lSrcLineBytes=pDoc-m_dib.GetReqByteWidth(lSrcWidth * 8);/ 计算图象每行的字节数long lDstLineBytes;/CDlgRot RotPara;/ 创建对话框if(RotPara.DoModal() != IDOK)/ 显示对话框,设定旋转角度return;DWORD palSize=pDoc-m_dib.GetPalSize(lpSrcDib);float fRotateAngle = (float) AngleToRadian(RotPara.m_rotAngle);/ 将旋转角度从度转换到弧度float fSina = (float) sin(double)fRotateAngle);/ 计算旋转角度的正余弦float fCosa = (float) cos(double)fRotateAngle);floatfSrcX1,fSrcY1,fSrcX2,fSrcY2,fSrcX3,fSrcY3,fSrcX4,fSrcY4;/ 旋转前四个角的坐标(以图象中心为坐标系原点)floatfDstX1,fDstY1,fDstX2,fDstY2,fDstX3,fDstY3,fDstX4,fDstY4;/ 旋转后四个角的坐标(以图象中心为坐标系原点)fSrcX1 = (float) (- (lSrcWidth - 1) / 2);/ 计算原图的四个角的坐标fSrcY1 = (float) ( (lSrcHeight - 1) / 2);fSrcX2 = (float) ( (lSrcWidth - 1) / 2);fSrcY2 = (float) ( (lSrcHeight - 1) / 2);fSrcX3 = (float) (- (lSrcWidth - 1) / 2);fSrcY3 = (float) (- (lSrcHeight - 1) / 2);fSrcX4 = (float) ( (lSrcWidth - 1) / 2);fSrcY4 = (float) (- (lSrcHeight - 1) / 2);fDstX1 = fCosa * fSrcX1 + fSina * fSrcY1;/ 计算新图四个角的坐标fDstY1 = -fSina * fSrcX1 + fCosa * fSrcY1;fDstX2 = fCosa * fSrcX2 + fSina * fSrcY2;fDstY2 = -fSina * fSrcX2 + fCosa * fSrcY2;fDstX3 = fCosa * fSrcX3 + fSina * fSrcY3;fDstY3 = -fSina * fSrcX3 + fCosa * fSrcY3;fDstX4 = fCosa * fSrcX4 + fSina * fSrcY4;fDstY4 = -fSina * fSrcX4 + fCosa * fSrcY4;lDstWidth= (long) ( max( fabs(fDstX4 - fDstX1), fabs(fDstX3 - fDstX2) ) + 0.5);/ 计算旋转后的图象实际宽度lDstLineBytes=pDoc-m_dib.GetReqByteWidth(lDstWidth * 8);/ 计算新图象每行的字节数lDstHeight= (long) ( max( fabs(fDstY4 - fDstY1), fabs(fDstY3 - fDstY2) ) + 0.5);/ 计算旋转后的图象高度HGLOBAL hDstDIB = NULL;/ 创建新DIBhDstDIB = (HGLOBAL) Rotate(lpSrcDib,lpSrcStartBits,lSrcWidth,lSrcHeight,lSrcLineBytes,palSize,lDstWidth,lDstHeight,lDstLineBytes,fSina,fCosa);/ 调用Rotate()函数旋转DIBif(hDstDIB != NULL)/ 判断旋转是否成功pDoc-UpdateObject(hDstDIB);/ 替换DIB,同时释放旧DIB对象pDoc-SetDib();/ 更新DIB大小和调色板pDoc-SetModifiedFlag(TRUE);/ 设置脏标记pDoc-UpdateAllViews(NULL);/ 更新视图:GlobalUnlock(HGLOBAL) pDoc-GetHObject();/ 解除锁定elseAfxMessageBox(_T(分配内存失败!);/ 警告数字图像缩放图像缩放函数/* * 函数名称:Zoom(LPSTR lpSrcDib, LPSTR lpSrcStartBits,long lWidth, long lHeight, long lLineBytes,WORD palSize, long lDstWidth, long lDstHeight,long lDstLineBytes,floatfXZoomRatio, float fYZoomRatio) * 函数参数: * LPSTR lpSrcDib,指向源DIB的指针 * LPSTR lpSrcStartBits,指向源DIB的起始像素的指针 * long lWidth,源DIB图象宽度 * long lHeight,源DIB图象高度 * long lLineBytes,源DIB图象字节宽度(4的倍数) * WORD palSize,源DIB图象调色板大小 * long lDstWidth,目标图象宽度 * long lDstHeight,目标DIB图象高度 * long lDstLineBytes,目标DIB图象行字节数(4的倍数) * floatfhorRatio,水平缩放比率 * float fverRatio,垂直缩放比率 * 函数类型:HGLOBAL * 函数功能:用来缩放DIB图象 */HGLOBAL Zoom(LPSTR lpSrcDib, LPSTR lpSrcStartBits,long lWidth, long lHeight, long lLineBytes,WORD palSize,long lDstWidth,long lDstLineBytes,long lDstHeight, float fhorRatio,float fverRatio)LPSTRlpDstDib;/指向临时图象的指针long i; /行循环变量long j; /列循环变量long i1; /行循环变量long j1; /列循环变量LPSTRlpSrcDIBBits;/指向源像素的指针LPSTRlpDstDIBBits;/指向临时图象对应像素的指针LPSTRlpDstStartBits;/指向临时图象对应像素的指针 LPBITMAPINFOHEADER lpbmi;/ 指向BITMAPINFO结构的指针/ 分配内存,以保存缩放后的DIBHGLOBAL hDIB = (HGLOBAL) :GlobalAlloc(GHND, lDstLineBytes* lDstHeight + *(LPDWORD)lpSrcDib +palSize);if (hDIB = NULL)/ 判断是否是有效的DIB对象return FALSE;/ 不是,则返回lpDstDib= (char * ):GlobalLock(HGLOBAL) hDIB);/ 锁定内存memcpy(lpDstDib, lpSrcDib, *(LPDWORD)lpSrcDib +palSize);/ 复制DIB信息头和调色板lpDstStartBits=lpDstDib+ *(LPDWORD)lpDstDib/ 找到新DIB像素起始位置+palSize;/ 求像素起始位置,作用如同:FindDIBBits(lpSrcDib),这里尝试使用了这种方法,以避免对全局函数的调用lpbmi = (LPBITMAPINFOHEADER)lpDstDib;/ 获取指针lpbmi-biWidth = lDstWidth;/ 更新DIB中图象的高度和宽度lpbmi-biHeight =lDstHeight;for(i = 0; i lDstHeight; i+)/ 行操作for(j = 0; j = 0) & (j1= 0) & (i1GetHObject();/ 锁定DIBif (pDoc-m_dib.GetColorNum(lpSrcDib) != 256)/ 判断是否是8-bpp位图 AfxMessageBox(对不起,不是256色位图!);/ 警告 :GlobalUnlock(HGLOBAL) pDoc-GetHObject();/ 解除锁定 return;/返回 lpSrcStartBits=pDoc-m_dib.GetBits(lpSrcDib);/ 找到DIB图象像素起始位置lSrcWidth= pDoc-m_dib.GetWidth(lpSrcDib);/ 获取图象的宽度lSrcHeight= pDoc-m_dib.GetHeight(lpSrcDib);/ 获取图象的高度lSrcLineBytes=pDoc-m_dib.GetReqByteWidth(lSrcWidth * 8);/ 计算图象每行的字节数/DWORD palSize=pDoc-m_dib.GetPalSize(lpSrcDib);CDlgZoom ZoomPara;/ 创建对话框,设定平移量if (ZoomPara.DoModal() != IDOK)return;float fX = ZoomPara.m_horZoom;/ 获取设定的平移量,缩放比率float fY = ZoomPara.m_verZoom;lDstWidth= (long) (lSrcWidth*fX + 0.5);/ 计算缩放后的图象实际宽度,加0.5是由于强制类型转换时不四舍五入,而是直接截去小数部分lDstLineBytes=pDoc-m_dib.GetReqByteWidth(lDstWidth * 8);/转换后图象应有的行字节数,为4的倍数lDstHeight= (long) (lSrcHeight * fY + 0.5);/ 计算缩放后的图象高度HGLOBAL hDstDIB = NULL;/ 创建新DIBhDstDIB = (HGLOBAL) Zoom(lpSrcDib,lpSrcStartBits,lSrcWidth,lSrcHeight,lSrcLineBytes,palSize,lDstWidth,lDstLineBytes,lDstHeight,fX, fY);/ 调用Zoom()函数转置DIBif(hDstDIB != NULL)/ 判断旋转是否成功pDoc-UpdateObject(hDstDIB);/ 替换DIB,同时释放旧DIB对象pDoc-SetDib();/ 更新DIB大小和调色板pDoc-SetModifiedFlag(TRUE);/ 设置脏标记pDoc-UpdateAllViews(NULL);/ 更新视图:GlobalUnlock(HGLOBAL) pDoc-GetHObject();/ 解除锁定elseAfxMessageBox(_T(分配内存失败!);/ 警告数字图像转置图像转置函数/* * 函数名称: * Transpose(LPSTR lpSrcDib,LPSTR lpDibBits,longlWidth,longlHeight, long lLineBytes,long lDstLineBytes) * 函数参数: * LPSTRlpSrcDib,指向源DIB的指针 LPSTRlpSrcStartBits,指向DIB起始像素的指针 longlWidth,DIB图象的宽度 longlHeight,DIB图象的高度 longlLineBytes,DIB图象的行字节数,为4的倍数 longlDstLineBytes,临时DIB图象的行字节数,为4的倍数 * 函数类型:BOOL * 函数功能:该函数用来转置DIB图象 */BOOL Transpose(LPSTR lpSrcDib,LPSTR lpSrcStartBits,long lWidth,long lHeight, long lLineBytes,long lDstLineBytes)long i; /行循环变量long j; /列循环变量LPSTRlpSrcDIBBits;/指向源像素的指针LPSTRlpDstDIBBits;/指向临时图象对应像素的指针LPSTRlpDstStartBits;/指向临时图象对应像素的指针 HLOCALhDstDIBBits;/临时图象句柄LPBITMAPINFOHEADER lpbmi; / 指向BITMAPINFOHEADER结构的指针lpbmi = (LPBITMAPINFOHEADER)lpSrcDib;hDstDIBBits= LocalAlloc(LHND, lWidth * lDstLineBytes);/ 分配临时内存if (hDstDIBBits= NULL) / 判断是否内存分配return FALSE;/ 分配内存失败lpDstStartBits= (char * )LocalLock(hDstDIBBits);/ 锁定内存for(i = 0; i lHeight; i+)/ 针对图象每行进行操作for(j = 0; j biWidth = lHeight;lpbmi-biHeight = lWidth;LocalUnlock(hDstDIBBits);/ 释放内存LocalFree(hDstDIBBits);return TRUE;/ 返回该函数调用函数CDImagePorcess View视图类的/图像转置void CDImageProcessView:OnTranspose() / TODO: Add your command handler code hereCDImageProcessDoc* pDoc = GetDocument();/long lSrcLineBytes;/图象每行的字节数longlSrcWidth; /图象的宽度和高度longlSrcHeight;LPSTRlpSrcDib;/指向源图象的指针LPSTRlpSrcStartBits;/指向源像素的指针long lDstLineBytes;/新图象每行的字节数lpSrcDib= (LPSTR) :GlobalLock(HGLOBAL) pDoc-GetHObject();/ 锁定DIBif (pDoc-m_dib.GetColorNum(lpSrcDib) != 256)/ 判断是否是8-bpp位图 AfxMessageBox(对不起,不是256色位图!);/ 警告 :GlobalUnlock(HGLOBAL) pDoc-GetHObject();/ 解除锁定 return;/返回 /判断是否是8-bpp位图,不是则返回lpSrcStartBits=pDoc-m_dib.GetBits(lpSrcDib);/ 找到DIB图象像素起始位置lSrcWidth= pDoc-m_dib.GetWidth(lpSrcDib);/ 获取图象的宽度lSrcHeight= pDoc-m_dib.GetHeight(lpSrcDib);/ 获取图象的高度lSrcLineBytes=pDoc-m_dib.GetReqByteWidth(lSrcWidth * 8);/ 计算图象每行的字节数/lDstLineBytes=pDoc-m_dib.GetReqByteWidth(lSrcHeight * 8);/ 计算新图象每行的字节数if (Transpose(lpSrcDib,lpSrcStartBits,lSrcWidth,lSrcHeight,lSrcLineBytes,lDstLineBytes)/ 调用Transpose()函数转置DIBpDoc-SetDib();/ 更新DIB大小和调色板pDoc-SetModifiedFlag(TRUE);/ 设置脏标记pDoc-UpdateAllViews(NULL);/ 更新视图:GlobalUnlock(HGLOBAL) pDoc-GetHObject();/ 解除锁定elseAfxMessageBox(_T(分配内存失败!); / 警告数字图像垂直镜像图像垂直镜像函数/* * 函数名称:Mirrorchuizhi(LPSTR lpSr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 玻纤拉丝工创新方法能力考核试卷含答案
- 闽江学院《金融英语》2025-2026学年期末试卷
- 闽西职业技术学院《治安学》2025-2026学年期末试卷
- 泉州纺织服装职业学院《民法分论》2025-2026学年期末试卷
- 潜水指导员安全文明模拟考核试卷含答案
- 小学数学教师工作总结报告
- 绞盘机司机安全教育竞赛考核试卷含答案
- 重轨加工工冲突管理能力考核试卷含答案
- 海底管道配重工岗前理论知识考核试卷含答案
- 家用电器产品维修工成果转化模拟考核试卷含答案
- Lesson 1 On the Farm (教学设计)-2023-2024学年冀教版(三起)英语三年级下册
- DZ∕T 0270-2014 地下水监测井建设规范
- DL-T5153-2014火力发电厂厂用电设计技术规程
- 金融学基础(第三版)课件:巧用保险
- 麻醉复苏期患者的护理
- 高中数学专题讲座课件
- 雅思阅读:雅思阅读复习计划
- 机电一体化项目教程 课件 导言、任务1-7 传感器技术-加盖拧盖单元
- 网络安全与信息防护
- 地下管线测量技术方案
- 动产融资金融仓平台技术白皮书
评论
0/150
提交评论