C 将PPM图像旋转90度

C 将PPM图像旋转90度,c,ppm,C,Ppm,我正在尝试将PPM图像旋转90度。我目前能够将图像旋转180度。 我不知道该怎么做 我知道高度和宽度是交换的,但我不确定从那里去哪里 void write_ppm_image(const char *filename, Image_ppm *img) { FILE *fp; //open file for output fp = fopen(filename, "wb"); if (!fp) { fprintf(stderr, "Unable to open file '%s'\n",

我正在尝试将PPM图像旋转90度。我目前能够将图像旋转180度。 我不知道该怎么做

我知道高度和宽度是交换的,但我不确定从那里去哪里

void write_ppm_image(const char *filename, Image_ppm *img)
{
FILE *fp;
//open file for output
fp = fopen(filename, "wb");
if (!fp) {
    fprintf(stderr, "Unable to open file '%s'\n", filename);
    exit(1);
}

//write the header file
//image format
fprintf(fp, "P6\n");

//comments
fprintf(fp, "# Created by %s\n",CREATOR);

//image size
fprintf(fp, "%d %d\n",img->x,img->y);

// rgb component depth
fprintf(fp, "%d\n",RGB_COMPONENT_COLOR);

// pixel data
fwrite(img->data, 3 * img->x, img->y, fp);
fclose(fp);
}


 void rotatePPM(Image_ppm *img)
 {
int x = 0, y = 0;
int size = img->x*img->y;
int width = img->x;
int height = img->y;

if(img)
{

    for(i=0;i<size;i++)
    {
        int temp = img->data[i].red;
        int temp_one = img->data[i].green;
        int temp_two = img->data[i].blue;
        img->data[i].red = img->data[size].red;
        img->data[i].green = img->data[size].green;
        img->data[i].blue = img->data[size].blue;
        img->data[size].red = temp;
        img->data[size].green = temp_one;
        img->data[size].blue = temp_two;
        size--;
    }

}
 }

 int main()
 {
char  filename[256];
printf("Enter the name of a PPM image file: \n");
scanf("%s",filename);
Image_ppm *image;
image = read_ppm_image(filename);
rotatePPM(image);
write_ppm_image("can_bottom3.ppm",image);
printf("Press any key...");
getchar();
}
void write_ppm_image(常量字符*文件名,image_ppm*img)
{
文件*fp;
//打开文件进行输出
fp=fopen(文件名,“wb”);
如果(!fp){
fprintf(stderr,“无法打开文件“%s”\n”,文件名);
出口(1);
}
//写入头文件
//图像格式
fprintf(fp,“P6\n”);
//评论
fprintf(fp,#由%s\n创建,创建者);
//图像大小
fprintf(fp,“%d%d\n”,img->x,img->y);
//rgb分量深度
fprintf(fp,“%d\n”,RGB\u分量\u颜色);
//像素数据
fwrite(img->data,3*img->x,img->y,fp);
fclose(fp);
}
void rotatePPM(图像\u ppm*img)
{
int x=0,y=0;
int size=img->x*img->y;
int width=img->x;
int height=img->y;
如果(img)
{
对于(i=0;idata[i]),红色;
int temp_one=img->data[i]。绿色;
int temp_two=img->data[i]。蓝色;
img->data[i]。红色=img->data[size]。红色;
img->data[i]。绿色=img->data[size]。绿色;
img->data[i]。蓝色=img->data[size]。蓝色;
img->数据[大小]。红色=温度;
img->数据[大小]。绿色=临时值;
img->data[size].blue=temp\u two;
大小--;
}
}
}
int main()
{
字符文件名[256];
printf(“输入PPM图像文件的名称:\n”);
scanf(“%s”,文件名);
图像_ppm*图像;
图像=读取ppm图像(文件名);
rotatePPM(图像);
写入\u ppm\u图像(“can\u bottom3.ppm”,图像);
printf(“按任意键…”);
getchar();
}

虽然我从未实现过任何旋转算法,但我认为首先在纸上实现它会有所帮助

在正方形的纸上画一个矩形,每个正方形代表一个像素。用像素的坐标标记每个正方形。然后将纸旋转90度,再画一个同样大的矩形,同样用坐标标记每个“像素”

现在,当您将纸张向后翻转,使第一个矩形正常时,您可以很容易地看到在输出(第二个)矩形中放置像素的位置


找到一个通用的算法应该不会太难。

虽然我从未实现过任何旋转算法,但我认为首先在纸上实现它会有所帮助

在正方形的纸上画一个矩形,每个正方形代表一个像素。用像素的坐标标记每个正方形。然后将纸旋转90度,再画一个同样大的矩形,同样用坐标标记每个“像素”

现在,当您将纸张向后翻转,使第一个矩形正常时,您可以很容易地看到在输出(第二个)矩形中放置像素的位置


找到一个通用的算法应该不会太难。

您的方法似乎非常痛苦,而且只针对PPM

相反,您可以简单地使用ImageMagick
mogrify
gm mogrify
实用程序。您可以下载静态编译版本的GraphicsMagick
gm
,大小小于2MB


gm
可以被视为任何图像处理的“瑞士军刀”。除了使其简单之外,它还将毫不费力地支持PPM,而且几乎可以支持任何其他已知的图形格式。

您的方法似乎非常痛苦,而且只针对PPM

相反,您可以简单地使用ImageMagick
mogrify
gm mogrify
实用程序。您可以下载静态编译版本的GraphicsMagick
gm
,大小小于2MB


gm
可以被视为任何图像处理的“瑞士军刀”。除了使其简单之外,它不仅支持PPM,而且几乎可以毫不费力地支持任何其他已知的图形格式。

if(img)'应该放在'size=img->x*img->y;'之前,否则它就没用了。你有一个OFF-BY-ONE。比如说,如果x和y是1,你就有了size=1。所以你可以用不存在的数据[1]交换数据[0]。如果(img)应该放在'size=img->x*img->y;'之前,否则它就没用了。你有一个OFF-BY-ONE。比如说,如果x和y是1,你就有了size=1。所以你交换数据[0]有数据[1],这是不存在的。也许他这样做是为了学习,所以使用图书馆更多的是一种评论而不是一个答案。是的,当然。但是有一些实用的解决方案也是很好的。也许他这样做是为了学习,所以使用图书馆更多的是一种评论而不是答案。是的,当然。但是有一些实用的解决方案也是很好的奥斯。