C将PPM图像显示为文本

时间:2017-01-19 19:47:19

标签: c file ppm

我是编程C的新手,我正在尝试文件操作,我正在尝试输出一个PPM文件及其注释和rgb数据值,如下所示:

P3
# The same image with width 3 and height 2,
# using 0 or 1 per color (red, green, blue)
3 2 1
1 0 0   0 1 0   0 0 1
1 1 0   1 1 1   0 0 0

在这个程序中,我已经能够检查它是否具有正确的格式并读入结构但我被困在哪里是如何收集rgb数据然后将其打印出来。这是我到目前为止所拥有的。显示此信息的方法是showPPM结构,我已经开始但不知道如何读取图像结构并收集其rgb值并显示它,任何帮助都会很棒。

#include<stdio.h>
#include<stdlib.h>

typedef struct {
 unsigned char red,green,blue;
} PPMPixel;

typedef struct {
 int x, y;
 PPMPixel *data;
} PPMImage;


static PPMImage *readPPM(const char *filename)
{
     char buff[16];
     PPMImage *img;
     FILE *fp;
     int c, rgb_comp_color;
     //open PPM file for reading
     fp = fopen(filename, "rb");
     if (!fp) {
          fprintf(stderr, "Unable to open file '%s'\n", filename);
          exit(1);
     }

     //read image format
     if (!fgets(buff, sizeof(buff), fp)) {
          perror(filename);
          exit(1);
     }

//check the image format
if (buff[0] != 'P' || buff[1] != '3') {
     fprintf(stderr, "Invalid image format (must be 'P6')\n");
     exit(1);
}

//alloc memory form image
img = (PPMImage *)malloc(sizeof(PPMImage));
if (!img) {
     fprintf(stderr, "Unable to allocate memory\n");
     exit(1);
}

//check for comments
c = getc(fp);
while (c == '#') {
while (getc(fp) != '\n') ;
     c = getc(fp);
}

ungetc(c, fp);
//read image size information
if (fscanf(fp, "%d %d", &img->x, &img->y) != 2) {
     fprintf(stderr, "Invalid image size (error loading '%s')\n", filename);
     exit(1);
}

while (fgetc(fp) != '\n') ;
//memory allocation for pixel data
img->data = (PPMPixel*)malloc(img->x * img->y * sizeof(PPMPixel));

if (!img) {
     fprintf(stderr, "Unable to allocate memory\n");
     exit(1);
}

//read pixel data from file
if (fread(img->data, 3 * img->x, img->y, fp) != img->y) {
     fprintf(stderr, "Error loading image '%s'\n", filename);
     exit(1);
}

fclose(fp);
return img;
}

void showPPM(struct * image){
int rgb_array[600][400];
int i;
int j;

for(i = 0; i<600; i++)
{
    for(j = 0; j<400; j++)
    {
        printf("%d", rgb_array[i][j]);
    }
}
}


int main(){
PPMImage *image;
image = readPPM("aab.ppm");
showPPM(image);
}

1 个答案:

答案 0 :(得分:0)

您的代码看起来很可疑:

read PPM file and store it in an array; coded with C

还有一些非常好的评论和帮助。

所以,我将下面的其他内容作为进一步的帮助:

在这里开始有些模糊,让你有机会自己解决这个问题......

首先,您需要将整个ppm文件读入缓冲区。 fread()可能是此选择的功能。您可以使用ftell()来获取文件的大小。接下来,您可以在fread()使用的缓冲区之上对PPMImage结构进行类型转换,并且从那里,您应该能够通过data字段访问数据,如果您希望,甚至可以使用数组表示法。 (我认为这是你现在缺少的一步......)

一旦您可以访问数据,您应该能够根据输入数据迭代数据和printf()或您需要的任何内容。