2017-01-19 14 views
0

Я новичок в программировании C и я экспериментировал с манипуляцией файл, я пытаюсь вывести файл PPM с его комментариями и значения RGB данных следующим образом:C Дисплей PPM изображение Текст

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 

В этом программе я смог проверить, что он имеет правильный формат и читается в struct, но где я застрял - как собрать данные 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

Ваш вопрос не достаточно конкретный. «Не знаю, куда идти», это не вопрос. Что конкретно вы не понимаете? Во-первых, почему бы вам хотя бы не попытаться получить доступ к 'image', который был передан в функцию' showPPM'? Этот 'image' содержит структуру, которая имеет массив' data'. Просто перебирайте этот массив и распечатайте то, что вам нужно. – kaylum

+0

Спасибо, изменил мой вопрос, чтобы быть более конкретным, проблема, с которой я сталкиваюсь, - я не знаю, как распечатать структуру изображения, поскольку я не привык к c. –

+0

Что значит не знаете как? Вызовите 'printf'. Если вы не можете задать конкретный вопрос, тогда вам будет трудно помочь. Например, вы имеете в виду, что не знаете, как писать цикл для повторения данных? Или что конкретно? Кроме того, я думаю, что ваша функция readPPM неверна. 'fread (img-> data, 3 * img-> x, img-> y, fp)', который не будет работать. На входе есть пробелы, поэтому '3' байт для каждого пикселя недостаточно. – kaylum

ответ

0

Ваш код выглядит подозрительно, как:

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

Были некоторые действительно хорошие комментарии и помощь в том, что, как хорошо.

Итак, я оставляю другие вещи ниже, как дальнейшей помощи:


Начинаясь несколько расплывчато здесь, чтобы у вас есть возможность работать через него сами ...

Во-первых, вам нужно для чтения всего файла ppm в буфер. fread(), вероятно, является функцией выбора для этого. Вы можете использовать ftell(), чтобы получить размер файла. Затем вы можете придать структуру PPMImage поверх буфера, используемого fread(), и оттуда вы сможете получить доступ к данным через поле data, возможно, даже используя нотацию массива, если хотите. (Я думаю, что это тот шаг, который вам не хватает прямо сейчас ...)

После того, как вы сможете получить доступ к данным, вы должны иметь возможность перебирать данные и printf() или что вам нужно для консоли на основе входных данных ,