2013-07-24 3 views
0

Я использую файлы, pgm.c и pgm.h, чтобы читать в файле изображения PGM, а затем моя программа будет манипулировать файлом (оттенки серого, поворот и т. Д.).Чтение PGM-изображения в C (неверное чтение файла)

Однако я не могу заставить файл правильно читать. Когда я использую:

PGMImage* img = (PGMImage*)malloc(sizeof(PGMImage)); 
    char iName1[256]; 
    printf("Enter the filename of your PGM image:\n"); 
    scanf("%s", iName1); 
    getPGMfile(iName1, &img); 

Консоль возвращает тип, ширину, высоту и максимальное значение изображения. Однако ширина никогда не верна. Обычно это 0 (и один раз это было 56, путь), использую ли я файл .pgm, который я нашел онлайн, или один, который я сделал сам. Я даже пытался жестко кодировать ширину изображения, но даже в этом случае это приводит к сбою программы. Ширина должна быть прочитана в pgm.c, под функцией getPGMfile:

void getPGMfile (char filename[], PGMImage *img) 
{ 
    FILE *in_file; 
    char ch; 
    int row, col, type; 
    int ch_int; 

    in_file = fopen(filename, "r"); 
    if (in_file == NULL) 
    { 
    fprintf(stderr, "Error: Unable to open file %s\n\n", filename); 
    exit(8); 
    } 

    printf("\nReading image file: %s\n", filename); 

    /*determine pgm image type (only type three can be used)*/ 
    ch = getc(in_file); 
    if(ch != 'P') 
    { 
     printf("ERROR(1): Not valid pgm/ppm file type\n"); 
     exit(1); 
    } 
    ch = getc(in_file); 
    /*convert the one digit integer currently represented as a character to 
    an integer(48 == '0')*/ 
    type = ch - 48; 
    printf("Type: %d", type); 
    if((type != 2) && (type != 3) && (type != 5) && (type != 6)) 
    { 
     printf("ERROR(2): Not valid pgm/ppm file type\n"); 
     exit(1); 
    } 

    while(getc(in_file) != '\n');    /* skip to end of line*/ 

    while (getc(in_file) == '#')    /* skip comment lines */ 
    { 
    while (getc(in_file) != '\n');   /* skip to end of comment line */ 
    } 

    /*there seems to be a difference between color and b/w. This line is needed 
    by b/w but doesn't effect color reading...*/ 
    fseek(in_file, -1, SEEK_CUR);    /* backup one character*/ 

    fscanf(in_file,"%d", &((*img).width)); 
    fscanf(in_file,"%d", &((*img).height)); 
    fscanf(in_file,"%d", &((*img).maxVal)); 

    //I omitted the rest, but it can be seen in the link above 

Я понятия не имею, что вызывает эти ошибки. Я использую Eclipse и MinGW GCC для Windows 7 (64-разрядная версия). Мой инструктор не мог помочь мне решить эту проблему, поэтому я надеюсь, что вы сможете! :)

Резюмировать: Ширина изображения PGM всегда читается некорректно, после чего все, что происходит с файлом, заставляет исполняемый файл перестать работать. Жесткое кодирование ширины также приводит к тому, что исполняемый файл перестает работать.

+3

getpgm не должен быть передан адрес указателя, а просто указатель в соответствии с файлом заголовка: getPGMfile (iName1, img) – Magn3s1um

+0

Вам не разрешено использовать вызовы функций, предоставляемые netpbm http://netpbm.sourceforge.net/doc/libnetpbm.html –

+1

@ Magn3s1um: +1, за исключением того, что это ответ, потому что он правильный. – rici

ответ

0

формат PGM выход идет как

P5 
wid ht 
xxx xxx xxx xxx 

где ххх являются значения растра. Вам нужно избавиться от каждой функции getc перед чтением ширины или выполнить команду ungetc, когда вам не удастся найти персонажа, которого вы ищете. Затем ширина будет считаться соответствующим образом.

+0

Downvoter, поясните пожалуйста. – unxnut

+0

Спасибо. Это действительно помогло. У меня есть ширина! – James

2

getpgm не должен быть передан адрес указателя, а только указатель в соответствии с файлом заголовка: getPGMfile (iName1, IMG)

+0

Спасибо! Что помогает. Любая идея, почему ширина не будет считаться правильно? – James

+0

Я могу сказать вам, если вы показываете, что такое печать, вероятно, – Magn3s1um

+0

Код: 'code'printf (" \ n width =% d ", (* img) .width); 'code'printf (" \ n height =% d ", (* img) .height); 'code'printf (" \ n maxVal =% d ", (* img) .maxVal); 'code'printf (" \ n "); консоли: Чтение файла изображения C: \\ balloons.pgm Тип: 2 ширина = 0 высота = 480 MAXVAL = 255 – James