【问题标题】:How to rotate an image 90 degrees in C如何在 C 中将图像旋转 90 度
【发布时间】:2012-11-08 16:35:13
【问题描述】:

我一直在尝试将图像变为黑白,然后在 C 中将其旋转 90 度,但我对编程还很陌生,这就是我必须要做的。

#include<stdio.h>
#include<string.h>

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;

【问题讨论】:

  • rotation in wikipedia。 3d 中的旋转并不意味着与 2d 中的相同。一个坐标是固定的吗?
  • @UmNyobe 他的三维是颜色,所以它实际上是一个二维旋转。

标签: c arrays pixels flip


【解决方案1】:

基本逻辑是这样的:

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 坐标。

另外需要注意的是,旋转后的图像的宽度和高度与原始图像相反。

【讨论】:

  • @RichardJ.RossIII:我的错。已更正。
  • 只要确保目的地的宽度和高度设置正确,否则会出现 OOB 错误!
【解决方案2】:

一般来说,您可以使用下一个公式顺时针旋转一个点 alpha 度 设点 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;

我希望这会有所帮助

【讨论】:

    【解决方案3】:
    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];
    }
    

    【讨论】:

    • 我不想创建一个新数组,我只想以这样一种方式打印我的初始黑色数组,使其按照我需要打印的顺序打印。这就是我为(i=0;i=0;--j) fprintf(third,"%d %d %d\n",black[j ][i][0],黑色[j][i][1],黑色[j][i][2]);它可以工作,但我的图片有一个黑色像素穿过它的剪辑。我很接近...有什么建议吗?
    • 最后一个:for (j=width-1;j>=0;--j)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 2011-01-14
    • 2021-05-01
    相关资源
    最近更新 更多