原始的图像为509*511,我想对以(256,256)为原点的376*376的矩形做旋转.先读出图像的数据,然后用原位置的像素值代替新位置的像素值,最后重新生成一个新的位图.现在的问题是当旋转角度为0度时,可以成功生成一幅新的位图,当旋转角度为90度时,图像不旋转,但是图像下部出现了一些白点.主要代码如下:
BITMAPFILEHEADER bmiFHeader;
BITMAPINFOHEADER bminfoH;
BmpFileName = "ImageData.bmp";
filePtr3 = fopen(BmpFileName,"rb");
if ( filePtr3 == NULL )
{
AfxMessageBox( "ERROR: Failed to open file for writing output data." );
}
fread( &bmiFHeader , 1 , 14 , filePtr3 );
fread( &bminfoH , 1 , 40 , filePtr3 );
fseek( filePtr3 , 256*4 , SEEK_CUR);
long nData = ( bminfoH.biWidth ) * ( bminfoH.biHeight );
BYTE* pColorData = new BYTE[nData];
fread( pColorData , 1 , nData , filePtr3 );
fclose(filePtr3);
UpdateData(true);
a=m_Rotate;
UpdateData(false);
BYTE* pBuffer = new BYTE[261632];//512*511
for(int i=0;i<261632;i++)
{
pBuffer[i]=pColorData[i];
}
for(y0=67;y0<444;y0++)
{
for(x0=68;x0<446;x0++)
{
x1=(int)((x0-a0)*cos(pi*a/180)+(b0-y0)*sin(pi*a/180)+a1);//坐标变换
y1=(int)((x0-a0)*sin(pi*a/180)-(b0-y0)*cos(pi*a/180)+b1);
if(x1<68 || x1>445 || y1<67 || y1>443)
{
pBuffer[x1*y1]=0;
}
else
{
pBuffer[x1*y1]=pColorData[x0*y0];
}
}
}
BmpFileName = "test1.bmp";
filePtr2 = fopen(BmpFileName,"wb");
fwrite( &bmiFHeader, sizeof(BITMAPFILEHEADER), 1, filePtr2 );
fwrite( &bminfoH, sizeof(BITMAPINFOHEADER), 1, filePtr2 );
fwrite( bmiColors,256*sizeof(RGBQUAD),1,filePtr2);
fwrite( pBuffer, nData, 1, filePtr2 );
fclose( filePtr2 );
delete []bmiColors;
delete []pColorData;
delete []pBuffer;
BITMAPFILEHEADER bmiFHeader;
BITMAPINFOHEADER bminfoH;
BmpFileName = "ImageData.bmp";
filePtr3 = fopen(BmpFileName,"rb");
if ( filePtr3 == NULL )
{
AfxMessageBox( "ERROR: Failed to open file for writing output data." );
}
fread( &bmiFHeader , 1 , 14 , filePtr3 );
fread( &bminfoH , 1 , 40 , filePtr3 );
fseek( filePtr3 , 256*4 , SEEK_CUR);
long nData = ( bminfoH.biWidth ) * ( bminfoH.biHeight );
BYTE* pColorData = new BYTE[nData];
fread( pColorData , 1 , nData , filePtr3 );
fclose(filePtr3);
UpdateData(true);
a=m_Rotate;
UpdateData(false);
BYTE* pBuffer = new BYTE[261632];//512*511
for(int i=0;i<261632;i++)
{
pBuffer[i]=pColorData[i];
}
for(y0=67;y0<444;y0++)
{
for(x0=68;x0<446;x0++)
{
x1=(int)((x0-a0)*cos(pi*a/180)+(b0-y0)*sin(pi*a/180)+a1);//坐标变换
y1=(int)((x0-a0)*sin(pi*a/180)-(b0-y0)*cos(pi*a/180)+b1);
if(x1<68 || x1>445 || y1<67 || y1>443)
{
pBuffer[x1*y1]=0;
}
else
{
pBuffer[x1*y1]=pColorData[x0*y0];
}
}
}
BmpFileName = "test1.bmp";
filePtr2 = fopen(BmpFileName,"wb");
fwrite( &bmiFHeader, sizeof(BITMAPFILEHEADER), 1, filePtr2 );
fwrite( &bminfoH, sizeof(BITMAPINFOHEADER), 1, filePtr2 );
fwrite( bmiColors,256*sizeof(RGBQUAD),1,filePtr2);
fwrite( pBuffer, nData, 1, filePtr2 );
fclose( filePtr2 );
delete []bmiColors;
delete []pColorData;
delete []pBuffer;
midpoint 中点
x0 y0 旋转前目标点的位置
x1 y1 旋转后目标点的位置x1=(int)(midpoint.x+(x0-midpoint.x)*cos(radians)-(y0-midpoint.y)*sin(radians));
y1=(int)(midpoint.y+(x0-midpoint.x)*sin(radians)+(y0-midpoint.y)*cos(radians));这样转是转起来了,不过据我观察半径有变化,多转几圈变化就比较明显了。(用鼠标拖着来几次360度,已经离开始位置比较远了)
还没想到解决的办法。看到楼主的代码中也有相似的语句,借光贴下问题等解决了。
x1=(int)((x0+a0)*cos(pi*-a/180)+(-b0-y0)*sin(pi*-a/180)-a1);
y1=(int)((x0+a0)*sin(pi*-a/180)-(-b0-y0)*cos(pi*-a/180)-b1);
pBuffer[x0*y0]=pColorData[x1*y1];