原始的图像为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;

解决方案 »

  1.   

    麻烦,为何不用GDI+的矩阵变换功能?
      

  2.   

    等结果我自己做的简单画图程序中也用了旋转,用下面的语句实现的radians 绕中点旋转的角度
    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度,已经离开始位置比较远了)
    还没想到解决的办法。看到楼主的代码中也有相似的语句,借光贴下问题等解决了。
      

  3.   

    你做的是src到dest的映射,这样不能保证填充满dest区域,应该反过来求dest到src的映射,
    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];
      

  4.   

    我碰到的情况和billy145533(努力升星) 类似,正在找解决办法。不过我没有试过用数组处理。希望一起学习并请教高手吧。我的QQ:397191171,不知哪位同仁有图像相关的群或者网站吗,可以联系一下,谢了先