我正在尝试将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();
}
答案 0 :(得分:3)
虽然我从未实施过任何轮换算法,但我认为首先在纸上做这件事会有所帮助......
在方形纸上绘制一个矩形,其中每个方块代表一个像素。使用像素的坐标标记每个方块。然后将纸张旋转90度,并再次绘制第二个同样大的矩形,每个“像素”用坐标标记。
现在当您将纸张翻转以使第一个矩形正常时,您可以轻松地看到将像素放在输出(第二个)矩形的位置。
为此找到一般算法应该不会太难。
答案 1 :(得分:0)
你的方法看起来非常痛苦,只针对PPM。
相反,您可以简单地使用ImageMagick mogrify
或GraphicsMagick gm mogrify
实用程序。您可以下载尺寸小于2MB的静态编译版GraphicsMagick gm
。
gm
都可以被视为“瑞士军刀”。除了简化之外,它不仅可以毫不费力地支持PPM,还可以支持几乎任何其他已知的图形格式。