c - 如何在C中将图像旋转90度

标签 c arrays pixel flip

我一直在尝试将图像变成黑白,然后在 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;

最佳答案

基本逻辑是这样的:

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。

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

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

关于c - 如何在C中将图像旋转90度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13476099/

相关文章:

ios - 检查用户何时滑过 UIView - touchesMoved 太滞后

c++ - 设置像素格式并在 SDL 中从表面创建纹理

opencv - 在opencv中读取检测到的圆圈中像素的HSV值

c++ - - C++ - 使用计时器线程启动异常,精度 ms

c - C语言中的指针和赋值函数

javascript - Typeahead 结果填充返回整个数组对象

arrays - 从 PowerShell 数组中删除重复值

c - 在 C 中加载数组及其下标的平方

c - K&R C - 在换行符后添加 '\0'

javascript - (JavaScript) 将数据从较大的数组存储到具有其他关键属性的较小数组