Вопрос

Я пытаюсь написать файл 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");
}

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

Это было полезно?

Решение

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

pixel11 pixel12 pixel13
pixel14 pixel15
# switch to next row
pixel21 pixel22 pixel23
pixel24 pixel25
# etc.

Другие советы

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

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

Но вы пишете строку элемента высоты.Итак, вы, вероятно, неправильно получаете доступ к данным.На самом деле попробуйте отладить (карандашом) изображение из 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");
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top