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