从网上找了一个CImage的旋转函数,但是好像在读取一些图片的时候会出错,
哪位大神知道问题出在哪里呢?
//------图像旋转
//参数:源图像 目标图像 旋转度(alpha = angle * 3.14 / 180)
//using method: CImage *dest = new CImage;ImageRotate(src,dest,alpha);
//算法:邻近点算法
void ImageRotate(CImage *Imgm, CImage *Imgn, double alpha)
{
int ww, Dx, Dy, bpd;
double centerx, centery, sintheta, costheta;
double X1, Y1, X2, Y2, theta, xx, yy, rr;
BYTE **list, *sc, *lp;
int x, y;
//Dx获取宽度
Dx=Imgm->GetWidth();
//Dy获取高度
Dy=Imgm->GetHeight();
sc=(BYTE*)malloc(2*(Dx*Imgm->GetBPP()+31)/32*4); //申请工作单元
list=(BYTE**)malloc(Dy*sizeof(BYTE*)); //对原位图建立二维数组
//list中保存的是每一个高度像素的地址
for (int i=0;i<Dy;i++)
{
list[i]=(BYTE*)Imgm->GetPixelAddress(0, i);
}
//计算位图中心位置
centerx=Dx/2.0+0.5;
centery=Dy/2.0+0.5;
//计算对角线长度
rr=sqrt(centerx*centerx+centery*centery);
//反正切
theta=atan(centery/centerx);
//求图像边缘长度
X1=fabs(rr*cos(alpha+theta))+0.5;
Y1=fabs(rr*sin(alpha+theta))+0.5;
X2=fabs(rr*cos(alpha-theta))+0.5;
Y2=fabs(rr*sin(alpha-theta))+0.5;
//得外接矩形宽度 哪条边长就用哪个长度
if (X2>X1)
X1 = X2;
//外接矩形高度
if (Y2>Y1)
Y1 = Y2;
//图片的像素值
ww=(int)(2 * X1);
Imgn->Destroy();
//建立结果位图
Imgn->Create(ww,(int)(2*Y1),Imgm->GetBPP());
bpd = Imgm->GetBPP()/8;
sintheta = sin(alpha);
costheta = cos(alpha);
for (int j=(int)(centery-Y1),Yd=0;j<=(centery + Y1);j++,Yd++)
{
//256色位图像素行置背景值
if (Imgm->GetBPP()==8)
memset(sc,255,ww);
//真彩色位图像素行置背景值
else
memset(sc,255,ww*bpd);
for (int i=(int)(centerx-X1),Xd=0;i<=centerx+X1;i++,Xd+=bpd)
{
xx=centerx+costheta*(i-centerx)+sintheta*(j-centery);
yy=centery-sintheta*(i-centerx)+costheta*(j-centery);
x=(int)(xx+0.5);
y=(int)(yy+0.5);
if (x<0||x>= Imgm->GetWidth()||y<0||y>=Imgm->GetHeight())
continue;
if(x==Imgm->GetWidth())
x--;
if(y==Imgm->GetHeight())
y--;
memcpy(&sc[Xd],&list[y][x*bpd],bpd); //从源位图复制像素数据
}
lp=(BYTE*)Imgn->GetPixelAddress(0,Yd); //处理结果总结果位图
memcpy(lp,sc,ww*bpd);
}
free(list); //释放工作单元
free(sc);
}
已知在读取某些bmp和png图像时函数会挂掉。。