Запись файла PGM в C не работает - PullRequest
0 голосов
/ 27 февраля 2012

Я пытаюсь записать файл PGM в программе на C, но как только он записывается, если я пытаюсь открыть его для просмотра изображения, мне говорят, что формат файла изображения не может быть определен.

Однако, если я создаю новый файл в geany, скопирую данные, а затем сохраню ТО как новый PGM, это сработает.

Есть идеи, почему это может быть?

FILE * grey = fopen("greyscale.pgm", "w");

fprintf(grey, "P2 \r\n%d %d \r\n255 \r\n", width, height);

for (i = 0; i < width; i++) {
    for (j = 0; j < height; j++) {
        fprintf(grey, "%d ", ((imageArray[i][j].red + imageArray[i][j].green + imageArray[i][j].blue)/3));
    }
    fprintf(grey, "\r\n");
}

Я конвертирую цветное изображение в оттенки серого.

Ответы [ 2 ]

1 голос
/ 28 февраля 2012

Я думаю, вам не следует использовать \r\n в качестве разделителя строк, а только \n.Также убедитесь, что длина строки не превышает 70 символов.Поскольку для каждого пикселя требуется не более 4 символов (3 плюс пробел), вставляйте \n после каждых 17 пикселей.Вы можете разделить реальные строки с комментариями (например:

pixel11 pixel12 pixel13
pixel14 pixel15
# switch to next row
pixel21 pixel22 pixel23
pixel24 pixel25
# etc.
1 голос
/ 27 февраля 2012

Глядя на ваш код, я вижу, что вы вставляете new line каждые height элементы.В соответствии с форматом файла PGM, после заголовка следует

  • A растр высот строк в порядке сверху вниз.Каждая строка состоит из значений ширины серого в порядке слева направо.

Но вы пишете строку элемента высоты.Итак, вы, вероятно, обращаетесь к данным неверным способом.На самом деле, попробуйте отладить (карандашом) изображение из 3 столбцов (ширина) и 4 строк (высота).

Сказав это, измените цикл, чтобы записывать данные в главном порядке:

// write data to file
int row, col;
for (row = 0; row < height; ++row)
{
    for (col = 0; col < width; ++col)
    {
        fprintf(grey, "%d ", (imageArray[row][col].red + imageArray[row][col].green + imageArray[row][col].blue)/3));
    }
    fprintf(grey, "\n\r");
}
...