如何在C中旋转90度的图像

我一直试图将图像变成黑白图像,然后用C旋转90度,但我对编程很新,这就是我所要做的。

#include #include int main () { FILE* first; FILE* second; FILE* third; int counter; char c; int width, height, pixelmax, average; int pixelred, pixelgreen, pixelblue, black[300][300][3]; int i, j, timer=0; int k, f=0; first=fopen("blackbuck.ppm","r"); second=fopen("blacktrout.ppm","w"); 

这会跳过前几行代码

 for(counter=1;counter<3;counter++){ do{ c=getc(first); }while(c != '\n'); } fscanf(first,"%d%d", &width,&height); fscanf(first,"%d", &pixelmax); 

在这个程序的这一部分,我通过取平均值将像素转为黑白,这是最容易的部分。

 for(i=0, j=0; i<width;i++, timer++){ fscanf(first,"%d%d%d",&pixelred,&pixelgreen,&pixelblue); average=(pixelred+pixelgreen+pixelblue)/3; black[i][j][0]=average; black[i][j][1]=average; black[i][j][2]=average; fprintf(second,"%d %d %d\n",black[i][j][0],black[i][j][1],black[i][j][2]); if (i==(width-1)&& j<height){ i=0; j++; } } fclose(first); fclose(second); third=fopen("blackflip.ppm","w"); 

这是我完全迷失的部分,我不知道如何将我的3d数组中的像素存储旋转90度。 有什么帮助吗? 对于像我这样的新手程序员来说,一个解释得很好的解释会有很长的路要走。 谢谢!

 for(...???) } } return 0; 

基本逻辑是这样的:

 original_x = original_height-1-rotated_y original_y = rotated_x rotated_image(rotated_x,rotated_y) = original_image(original_x,original_y) 

假设(0,0)是左上角,我们想要向左旋转90度。 然后旋转图像的左上角相当于原始图像的右上角,即(original_height-1,0)。

当您越过图像顶部时,增加x,您将从右侧抓取原始图像中的像素,增加y,因此旋转图像的x与原始图像的y相似。

当您在rotate_image中向下移动时,增加y,您将更多地移动到original_image的左侧,这就是为什么我们从original_height-1中减去rotate_y以获得original_x坐标。

另一件需要注意的事情是旋转图像的宽度和高度与原始图像相反。

一般情况下,你可以使用下一个公式顺时针旋转一个点α度。让一个点P(x,y)让alpha成为你想要顺时针旋转的度数

然后x_rotated = x * cos(alpha) – y * sin(alpha); y_rotated = x * sin(alpha)+ y * cos(alpha);

如果alpha是顺时针90度那么

x_rotated = -y; y_rotated = x;

我希望这会有所帮助

 for (i = width-1 ; i >= 0 ; --i){ for(j = height-1 ; j >= 0 ; --j) // use formulas: x' = y; y' = -x' to rotate left rotated[i][j] = black[j][width-i-1]; }