处理的是8位灰度图像,编译通过,执行的时候程序会崩溃。调试了一下到那个注释是一串叹号的位置会有异常
另外,程序添加了DIBAPI文件,封装了一些东西。
void CTest1View::OnBmpRotate() /*以图像中心为坐标原点*/
{
// TODO: Add your command handler code here CTest1Doc *pDoc=GetDocument();  //文档类指针
/*源图像*/ HDIB hDB=pDoc->hDb;  //句柄
if(hDB==NULL)
{
return;
}
LPSTR pDB=(LPSTR)LocalLock(hDB); //句柄到指针,之后都是对指针的操作
LONG Width=DIBWidth(pDB);  //图像宽度
LONG Height=DIBHeight(pDB);//图像高度
LONG LineBytes=(Width*8+31)/32*4;//每行是4的整数倍 源图像每行像素数
LPBYTE pData=(LPBYTE)FindDIBBits(pDB); //从句柄指针到数据指针

/*旋转控制变量定义*/ int iRotateAngle=30;  //旋转角度
float fRotateAngle=0.0; //弧度表示的角度
float fSina,fCosa;  //旋转角度(弧度表示)的正弦余弦
/*源图像是Src   新图像是Dst*/
float SrcX1,SrcY1,SrcX2,SrcY2,SrcX3,SrcY3,SrcX4,SrcY4;//源图像四角坐标
float DstX1,DstY1,DstX2,DstY2,DstX3,DstY3,DstX4,DstY4;//新图像四角坐标
float f1=0.0,f2=0.0;//两个中间常量 /*角度转成弧度*/
fRotateAngle=((float)iRotateAngle)*3.1415/180;
fSina=(float)sin((double)fRotateAngle);//正弦
fCosa=(float)cos((double)fRotateAngle);//余弦 /*源图像四个角*/
SrcX1=(float)(-(Width-1)/2);
SrcY1=(float)(Height-1)/2;
SrcX2=(float)((Width-1)/2);
SrcY2=(float)(Height-1)/2;
    SrcX3=(float)(-(Width-1)/2);
SrcY3=(float)(-(Height-1)/2);
SrcX4=(float)((Width-1)/2);
SrcY4=(float)(-(Height-1)/2);
/*新图像的四个角*/
DstX1=fCosa*SrcX1+fSina*SrcY1;
DstY1=-fSina*SrcX1+fCosa*SrcY1;
DstX2=fCosa*SrcX2+fSina*SrcY2;
DstY2=-fSina*SrcX2+fCosa*SrcY2;
    DstX3=fCosa*SrcX3+fSina*SrcY3;
DstY3=-fSina*SrcX3+fCosa*SrcY3;
    DstX4=fCosa*SrcX4+fSina*SrcY4;
DstY4=-fSina*SrcX4+fCosa*SrcY4;

/*新图像*/
LONG Width2=(LONG)(max(fabs(DstX4=DstX1),fabs(DstX3-DstX2))+0.5);
LONG Height2=(LONG)(max(fabs(DstY4=DstY1),fabs(DstY3-DstY2))+0.5);
LONG LineBytes2=(Width2*8+31)/32*4;
HDIB hDB2=(HDIB)LocalAlloc(LMEM_MOVEABLE,40+256*4+LineBytes2*Height2);//40是信息头,256*4是调色板
//bmp文件是先存信息头再存调色板再存pData数据的,前面也是这个道理
    LPSTR pDB2=(LPSTR)LocalLock(hDB2);   //指针
LPBYTE pData2=(LPBYTE)pDB2+40+256*4;  //数据
    memcpy(pDB2,pDB,40+256*4);  //// LPSTR lpSrc,lpDst;  //指向源数据,新数据的指针 int i,j,io,jo;//i变换后  io变换前
for(i=0;i<Width2;i++)
{
for(j=0;j<Height2;j++)
{
// lpDst=pData2+40+256*4;
// lpSrc=pData+40+256*4; io=(LONG)(-((float)j)*fSina+((float)i)*fCosa+f2+0.5);
jo=(LONG)(((float)j)*fCosa+((float)i)*fSina+f1+0.5);
if((jo>=0)&&(jo<=Width)&&(io>=0)&&(io<=Height))
{
// *lpDst=*lpSrc;
pData2[i*LineBytes2+j]=pData[io*LineBytes+jo]; //  !!!!!!!!!!!
}
else
{
// *lpDst=0;
pData2[i*LineBytes2+j]=255;
}
} }
      pDoc->hDb=hDB2;
    Invalidate();
// }
}