原理已经讲完,图像旋转代码实现如下(以图像中心旋转):
void RotateNormal(BYTE * image0,BYTE * &image1,unsigned int w,unsigned int h,
unsigned int & outwidth,unsigned int & outheight,double angle)
{// 原始图像四个角的坐标
int srcX1,srcX2,srcX3,srcX4;
int srcY1,srcY2,srcY3,srcY4;
srcX1=0;
srcY1=0;
srcX2=w-1;
srcY2=0;
srcX3=0;
srcY3=h-1;
srcX4=w-1;
srcY4=h-1;
// 计算旋转角度的正弦和余弦值
double fsin=sin(angle);
double fcos=cos(angle);
// 图像经过旋转后四个角的坐标
double desX1,desX2,desX3,desX4;
double desY1,desY2,desY3,desY4;
desX1=fcos*srcX1+fsin*srcY1;
desY1=-fsin*srcX1+fcos*srcY1;
desX2=fcos*srcX2+fsin*srcY2;
desY2=-fsin*srcX2+fcos*srcY2;
desX3=fcos*srcX3+fsin*srcY3;
desY3=-fsin*srcX3+fcos*srcY3;
desX4=fcos*srcX4+fsin*srcY4;
desY4=-fsin*srcX4+fcos*srcY4;
/*int*/ outwidth=(int)(max(fabs(desX4-desX1),fabs(desX3-desX2))+0.5);
/*int*/ outheight=(int)(max(fabs(desY4-desY1),fabs(desY3-desY2))+0.5);
image1=new BYTE[outwidth*outheight*4];
memset(image1,255,outwidth*outheight*4);
double num1=-0.5*outwidth*fcos-0.5*outheight*fsin+0.5*w;
double num2=0.5*outwidth*fsin-0.5*outheight*fcos+0.5*h;
BYTE *copypixel=NULL;
BYTE *objpixel=NULL;
int x=0;
int y=0;
for(int j=0;j<outheight;j++)
for(int i=0;i<outwidth;i++)
{
x=(int)(i*fcos+j*fsin+num1+0.5);
y=(int)(-i*fsin+j*fcos+num2+0.5);
if(x==w)
x--;
if(y==h)
y--;
copypixel=image0+y*w*4+x*4;
objpixel=image1+j*outwidth*4+i*4;
if(x>=0 && x<w && y>=0 && y<h)
memcpy(objpixel,copypixel,4);
}
}