下面这段代码是VC的旋转双线性插值算法,先来看这段代码: /************************************************************************* * 函数名称: * RotateDIB2() * 参数: * LPSTR lpDIB - 指向源DIB的指针 * int iRotateAngle - 旋转的角度(0-360度) * 返回值: * HGLOBAL - 旋转成功返回新DIB句柄,否则返回NULL。 * 说明: * 该函数用来以图像中心为中心旋转DIB图像,返回新生成DIB的句柄。 * 调用该函数会自动扩大图像以显示所有的象素。函数中采用双线性插 * 值算法进行插值。 ************************************************************************/ HGLOBAL CDibImage::RotateDIB2(LPSTR lpDIB, int iRotateAngle) { LONG lWidth; // 源图像的宽度 LONG lHeight; // 源图像的高度 LONG lNewWidth; // 旋转后图像的宽度 LONG lNewHeight; // 旋转后图像的高度 LONG lNewLineBytes; // 旋转后图像的宽度(lNewWidth',必须是4的倍数) LPSTR lpDIBBits; // 指向源图像的指针 HDIB hDIB; // 旋转后新DIB句柄 LPSTR lpDst; // 指向旋转图像对应象素的指针 LPSTR lpNewDIB; // 指向旋转图像的指针 LPSTR lpNewDIBBits; LPBITMAPINFOHEADER lpbmi; // 指向BITMAPINFO结构的指针(Win3.0) LPBITMAPCOREHEADER lpbmc; // 指向BITMAPCOREINFO结构的指针 LONG i; // 循环变量(象素在新DIB中的坐标) LONG j; FLOAT i0; // 象素在源DIB中的坐标 FLOAT j0; float fRotateAngle; // 旋转角度(弧度) float fSina, fCosa; // 旋转角度的正弦和余弦 // 源图四个角的坐标(以图像中心为坐标系原点) float fSrcX1,fSrcY1,fSrcX2,fSrcY2,fSrcX3,fSrcY3,fSrcX4,fSrcY4; // 旋转后四个角的坐标(以图像中心为坐标系原点) float fDstX1,fDstY1,fDstX2,fDstY2,fDstX3,fDstY3,fDstX4,fDstY4; float f1,f2; lpDIBBits = FindDIBBits(lpDIB); // 找到源DIB图像象素起始位置 lWidth = DIBWidth(lpDIB); // 获取图像的宽度 lHeight = DIBHeight(lpDIB); // 获取图像的高度 // 将旋转角度从度转换到弧度 fRotateAngle = (float) RADIAN(iRotateAngle); fSina = (float) sin((double)fRotateAngle); // 计算旋转角度的正弦 fCosa = (float) cos((double)fRotateAngle); // 计算旋转角度的余弦 // 计算原图的四个角的坐标(以图像中心为坐标系原点) fSrcX1 = (float) (- (lWidth - 1) / 2); fSrcY1 = (float) ( (lHeight - 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); // 计算新图四个角的坐标(以图像中心为坐标系原点) fDs