


下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、图像旋转算法VC实现 原创 2007-04-02 17:56:47 字号:大 中 小 /* * * 函数名称: * RotateDIB( * * 参数: * LPSTR lpDIB - 指向源DIB的指针 * int iRotateAngle - 旋转的角度(0-360度) * * 返回值: * HGLOBAL - 旋转成功返回新DIB句柄,否则返回NULL。 * * 说明: * 该函数用来以图像中心为中心旋转DIB图像,返回新生成DIB的句柄。 * 调用该函数会自动扩大图像以显示所有的象素。函数中采用最邻近插 * 值算法进行插值。 * */ HGLOBAL WINAPI RotateDIB(
2、LPSTR lpDIB, int iRotateAngle / 源图像的宽度和高度 LONG lWidth; LONG lHeight; / 旋转后图像的宽度和高度 LONG lNewWidth; LONG lNewHeight; / 图像每行的字节数 LONG lLineBytes; / 旋转后图像的宽度(lNewWidth,必须是4的倍数) LONG lNewLineBytes; / 指向源图像的指针 LPSTR lpDIBBits; / 指向源象素的指针 LPSTR lpSrc; / 旋转后新DIB句柄 HDIB hDIB; / 指向旋转图像对应象素的指针 LPSTR lpDst; /
3、指向旋转图像的指针 LPSTR lpNewDIB; LPSTR lpNewDIBBits; / 指向BITMAPINFO结构的指针(Win3.0) LPBITMAPINFOHEADER lpbmi; / 指向BITMAPCOREINFO结构的指针 LPBITMAPCOREHEADER lpbmc; / 循环变量(象素在新DIB中的坐标) LONG i; LONG j; / 象素在源DIB中的坐标 LONG i0; LONG j0; / 旋转角度(弧度) float fRotateAngle; / 旋转角度的正弦和余弦 float fSina, fCosa; / 源图四个角的坐标(以图像中心为坐
4、标系原点) float fSrcX1,fSrcY1,fSrcX2,fSrcY2,fSrcX3,fSrcY3,fSrcX4,fSrcY4; / 旋转后四个角的坐标(以图像中心为坐标系原点) float fDstX1,fDstY1,fDstX2,fDstY2,fDstX3,fDstY3,fDstX4,fDstY4; / 两个中间常量 float f1,f2; / 找到源DIB图像象素起始位置 lpDIBBits = :FindDIBBits(lpDIB; / 获取图像的宽度(4的倍数) lWidth = :DIBWidth(lpDIB; / 计算图像每行的字节数 lLineBytes = WIDT
5、HBYTES(lWidth * 8; / 获取图像的高度 lHeight = :DIBHeight(lpDIB; / 将旋转角度从度转换到弧度 fRotateAngle = (float RADIAN(iRotateAngle; / 计算旋转角度的正弦 fSina = (float sin(doublefRotateAngle; / 计算旋转角度的余弦 fCosa = (float cos(doublefRotateAngle; / 计算原图的四个角的坐标(以图像中心为坐标系原点) fSrcX1 = (float (- (lWidth - 1 / 2; fSrcY1 = (float ( (l
6、Height - 1 / 2; fSrcX2 = (float ( (lWidth - 1 / 2; fSrcY2 = (float ( (lHeight - 1 / 2; fSrcX3 = (float (- (lWidth - 1 / 2; fSrcY3 = (float (- (lHeight - 1 / 2; fSrcX4 = (float ( (lWidth - 1 / 2; fSrcY4 = (float (- (lHeight - 1 / 2; / 计算新图四个角的坐标(以图像中心为坐标系原点) fDstX1 = fCosa * fSrcX1 + fSina * fSrcY1;
7、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; /
8、计算旋转后的图像实际宽度 lNewWidth = (LONG ( max( fabs(fDstX4 - fDstX1, fabs(fDstX3 - fDstX2 + 0.5; / 计算新图像每行的字节数 lNewLineBytes = WIDTHBYTES(lNewWidth * 8; / 计算旋转后的图像高度 lNewHeight = (LONG ( max( fabs(fDstY4 - fDstY1, fabs(fDstY3 - fDstY2 + 0.5; / 两个常数,这样不用以后每次都计算了 f1 = (float (-0.5 * (lNewWidth - 1 * fCosa - 0.
9、5 * (lNewHeight - 1 * fSina + 0.5 * (lWidth - 1; f2 = (float ( 0.5 * (lNewWidth - 1 * fSina - 0.5 * (lNewHeight - 1 * fCosa + 0.5 * (lHeight - 1; / 分配内存,以保存新DIB hDIB = (HDIB :GlobalAlloc(GHND, lNewLineBytes * lNewHeight + *(LPDWORDlpDIB + :PaletteSize(lpDIB; / 判断是否内存分配失败 if (hDIB = NULL / 分配内存失败 ret
10、urn NULL; / 锁定内存 lpNewDIB = (char * :GlobalLock(HGLOBAL hDIB; / 复制DIB信息头和调色板 memcpy(lpNewDIB, lpDIB, *(LPDWORDlpDIB + :PaletteSize(lpDIB; / 找到新DIB象素起始位置 lpNewDIBBits = :FindDIBBits(lpNewDIB; / 获取指针 lpbmi = (LPBITMAPINFOHEADERlpNewDIB; lpbmc = (LPBITMAPCOREHEADERlpNewDIB; / 更新DIB中图像的高度和宽度 if (IS_WIN3
11、0_DIB(lpNewDIB / 对于Windows 3.0 DIB lpbmi-biWidth = lNewWidth; lpbmi-biHeight = lNewHeight; else / 对于其它格式的DIB lpbmc-bcWidth = (unsigned short lNewWidth; lpbmc-bcHeight = (unsigned short lNewHeight; / 针对图像每行进行操作 for(i = 0; i lNewHeight; i+ / 针对图像每列进行操作 for(j = 0; j = 0 & (j0 = 0 & (i0 lHeight / 指向源DIB第
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 自行车与城市困境社群融合考核试卷
- 渔业装备智能化考核试卷
- 夫妻出轨财产分割及信任修复保障合同
- 摄影工作室设备更新与摄影技术培训合同
- 离岸公司设立与运营全方位服务合同
- 高端互联网公司兼职产品经理项目合作框架协议
- 专业财税培训机构税务讲师聘用及税务风险评估合同
- 文学创作隔音房租赁及知识产权保护协议
- 海外工程项目融资审批协议
- 婚前个人资产分割与婚后共同投资协议
- T-WSJD 21-2022 内镜储存干燥柜卫生要求
- 2025-2030中国聚丙烯三元共聚物行业市场发展趋势与前景展望战略研究报告
- 2025年上半年苏州太仓临港投资发展集团限公司公开招聘工作人员易考易错模拟试题(共500题)试卷后附参考答案
- 工业自动化控制系统调试与维护题库
- 2025届广东省佛山市高三语文二模高分范文12篇:“成长最大的悲哀是失去了想象力”
- 2025届陕西省高考适应性检测(三)物理试题+答案
- 西安职业技术学院招聘笔试真题2024
- 国际学校综合课程教研组计划
- (2025)全国交管12123学法减分测试题库及答案(带图版)
- DZ∕T 0219-2006 滑坡防治工程设计与施工技术规范(正式版)
- 《光伏发电工程工程量清单计价规范》
评论
0/150
提交评论