📜  用C程序以PGM格式写入图像(1)

📅  最后修改于: 2023-12-03 14:56:17.957000             🧑  作者: Mango

用C程序以PGM格式写入图像

在图像处理中,PGM格式是一种用于存储和传输灰度图像的文件格式。本文将介绍如何使用C程序将图像以PGM格式写入到文件中。

准备工作

在开始编写程序之前,需要准备一张用于测试的灰度图像。可以使用各种图像处理软件生成一张灰度图像,或者使用下面的代码生成一张简单的灰度图像。

#define WIDTH 256
#define HEIGHT 256

int main()
{
    char filename[] = "test.pgm";
    FILE *fp = fopen(filename, "w");
    fprintf(fp, "P2\n%d %d\n255\n", WIDTH, HEIGHT);
    for (int i = 0; i < HEIGHT; i++) {
        for (int j = 0; j < WIDTH; j++) {
            fprintf(fp, "%d ", i % 256);
        }
        fprintf(fp, "\n");
    }
    fclose(fp);
    return 0;
}

这段代码将生成一张大小为256x256的灰度图像,每个像素的灰度值为其所在行数对256取模的结果。生成的图像将保存在名为test.pgm的文件中。注意,PGM格式的文件头中需要包含图像大小和像素值的最大值,因此在使用fprintf写入文件头时需要仔细计算。

写入图像

有了一张用于测试的图像后,我们可以开始编写写入图像的程序了。首先,需要准备好要写入的图像数据及其大小。假设我们已经将图像数据保存在一个名为img的二维数组中,其大小为width x height。可以使用下面的代码将图像写入PGM格式文件。

void write_pgm(const char *filename, unsigned char **img, int width, int height)
{
    FILE *fp = fopen(filename, "w");
    // 写入文件头
    fprintf(fp, "P2\n%d %d\n255\n", width, height);
    // 写入图像数据
    for (int i = 0; i < height; i++) {
        for (int j = 0; j < width; j++) {
            fprintf(fp, "%d ", img[i][j]);
        }
        fprintf(fp, "\n");
    }
    // 关闭文件
    fclose(fp);
}

这段代码实现了一个名为write_pgm的函数,其接受四个参数:文件名、图像数据、图像宽度和图像高度。函数将以PGM格式将图像写入到指定文件中。在函数中,我们首先打开指定文件,然后写入PGM格式的文件头。接着,我们使用两个嵌套循环遍历整张图像,将每个像素依次写入文件。最后,我们关闭文件并退出函数。

测试程序

为了测试写入图像的程序,可以使用下面的代码读取刚刚写入的PGM格式文件并显示图像。

#define WIDTH 256
#define HEIGHT 256

int main()
{
    // 生成测试图像
    unsigned char **img = (unsigned char **)malloc(HEIGHT * sizeof(unsigned char *));
    for (int i = 0; i < HEIGHT; i++) {
        img[i] = (unsigned char *)malloc(WIDTH * sizeof(unsigned char));
        for (int j = 0; j < WIDTH; j++) {
            img[i][j] = i % 256;
        }
    }
    // 写入图像
    write_pgm("test.pgm", img, WIDTH, HEIGHT);
    // 读取图像
    FILE *fp = fopen("test.pgm", "r");
    char header[10];
    int width, height, maxval;
    fscanf(fp, "%s\n%d %d\n%d\n", header, &width, &height, &maxval);
    unsigned char **out = (unsigned char **)malloc(height * sizeof(unsigned char *));
    for (int i = 0; i < height; i++) {
        out[i] = (unsigned char *)malloc(width * sizeof(unsigned char));
        for (int j = 0; j < width; j++) {
            fscanf(fp, "%hhu ", &out[i][j]);
        }
    }
    fclose(fp);
    // 显示图像
    cv::Mat image(height, width, CV_8UC1, out);
    cv::imshow("Image", image);
    cv::waitKey(0);
    // 释放内存
    for (int i = 0; i < height; i++) {
        free(img[i]);
        free(out[i]);
    }
    free(img);
    free(out);
    return 0;
}

这段代码首先生成一个灰度图像作为测试用例,然后调用write_pgm函数将图像写入到文件中。接着,我们读取刚刚写入的文件,并将其显示出来以确认图像写入是否成功。最后,我们释放使用的内存并退出程序。

总结

本文介绍了如何使用C程序将图像以PGM格式写入到文件中。首先我们准备了一个用于测试的灰度图像,在此基础上编写了写入图像的程序,并对程序进行了测试。这个过程中,我们还简要介绍了PGM格式文件的文件头以及如何读写这种格式的文件。