写一段c代码实现:保存从 PPM 文件中读取的图像。这将需要包括来自 PPM 头文件的信息(宽度、高度、最大值),以及指向动态分配的包含像素数据的数组的指针。您的程序应该能够处理任意行数和列数的PPM 文件。
时间: 2024-02-11 16:04:18 浏览: 104
好的,这是一段可以保存PPM文件的C代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int width;
int height;
int max_val;
unsigned char *data;
} Image;
void save_ppm(char *filename, Image *img) {
FILE *file = fopen(filename, "wb");
fprintf(file, "P6\n%d %d\n%d\n", img->width, img->height, img->max_val);
fwrite(img->data, sizeof(unsigned char), img->width * img->height * 3, file);
fclose(file);
}
int main() {
// 读取PPM文件并解析
char *filename = "test.ppm";
FILE *file = fopen(filename, "rb");
if (!file) {
fprintf(stderr, "无法打开文件 %s\n", filename);
return 1;
}
char magic[3];
fscanf(file, "%2s\n", magic);
if (magic[0] != 'P' || magic[1] != '6') {
fprintf(stderr, "不是有效的PPM文件\n");
return 1;
}
Image img;
fscanf(file, "%d %d\n", &img.width, &img.height);
fscanf(file, "%d\n", &img.max_val);
img.data = (unsigned char *)malloc(img.width * img.height * 3);
fread(img.data, sizeof(unsigned char), img.width * img.height * 3, file);
fclose(file);
// 保存PPM文件
char *save_filename = "test_save.ppm";
save_ppm(save_filename, &img);
// 释放内存
free(img.data);
return 0;
}
```
这个程序首先会读取一个PPM文件,解析出它的宽度、高度、最大值和像素数据。然后,它会调用 `save_ppm` 函数来保存这个图像到另一个文件中。最后,它会释放掉动态分配的内存。
注意,这个程序假设输入的PPM文件是有效的,并且只支持P6格式的PPM文件。如果您需要支持其他格式的PPM文件,您需要相应地修改代码。
阅读全文