图像的旋转的插值算法_第1页
图像的旋转的插值算法_第2页
图像的旋转的插值算法_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论