Отображение неправильного цвета PPM

Я получаю странные результаты при отображении PPM:

отображение пикселей

(на самом деле это увеличенный PNG)

И вот как выглядит файл:

отображение текста

Размеры в порядке (10 строк, 8 столбцов), только цвета неправильные (или я ошибаюсь?).

Как сказано в 3-й строке файла, я хочу использовать значение от 0 до 255 на канал. Использование обычного цветового пространства RGB, такого как (255, 255, 255) для белого, (0, 0, 0) для черного, (255, 0, 0) для красного и так далее. Но эти цвета на изображении, видимо, не такие, как в файле.

Уже на первый взгляд изображение кажется слишком темным.

Я неправильно понимаю формат? Файл не интерпретируется таким образом?


person Rbt    schedule 27.05.2020    source источник
comment
Выкладывайте реальные данные, а не фото. В конце концов, это всего лишь текст ASCII.   -  person Mark Setchell    schedule 27.05.2020
comment
Какое программное обеспечение вы использовали, чтобы сделать изображение из данных?   -  person Mark Setchell    schedule 27.05.2020
comment
Спасибо за ответы. @Mark Setchell, что вы подразумеваете под фактическими данными, второй файл - это то, что я вижу, открывая его в редакторе, отличном от изображения?   -  person Rbt    schedule 27.05.2020
comment
@Mark Setchell: изображение было создано с помощью Krita, но выглядит одинаково в Gimp или ImageGlass.   -  person Rbt    schedule 27.05.2020
comment
Это изображение PNG, а не текстовый файл. Попробуйте загрузить файл PNG в ТЕКСТОВЫЙ РЕДАКТОР и выбрать файл 255. Вы не можете, потому что это пиксели, а не числа.   -  person Mark Setchell    schedule 27.05.2020


Ответы (1)


Этот документ: http://netpbm.sourceforge.net/doc/ppm.html описывает формат изображения PPM.

Когда в начале файла находится «магическое» значение P6, цвет пикселей сохраняется в виде двоичных данных. Цитируя ранее упомянутый документ (выделено мной):

[...] Растр строк высоты в порядке сверху вниз. Каждая строка состоит из пикселей ширины в порядке слева направо. Каждый пиксель представляет собой триплет красных, зеленых и синих образцов в указанном порядке. Каждый образец представлен в чистом двоичном формате 1 или 2 байтами. Если Maxval меньше 256, это 1 байт. В противном случае это 2 байта. Старший байт идет первым.

Файл, показанный спрашивающим, кажется, вместо этого содержит их десятичное текстовое представление.

Итак, строка "\n224 93 229..." (да, я подозреваю, что оконечная последовательность окон "\r\n") интерпретируется как (при условии, что файл был сохранен в формате ASCII) {10, 50, 50}, {50, 32, 32}, {57, 51, 32}, ....

Обратите внимание на черноватый пиксель в середине, который, вероятно, соответствует концу первой строки, это может быть {13, 10, 32} ("\r\n ").

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

person Bob__    schedule 27.05.2020
comment
спасибо за это, это решило это. Просто для полноты картины я немного поиграл, чтобы заставить работать двоичную версию P6. Я получил цвета, но не те, которые я ожидал. Как будет выглядеть цвет в двоичной версии? - person Rbt; 27.05.2020
comment
@Rbt Как вы пишете эти файлы? Используете ли вы запись? - person Bob__; 27.05.2020
comment
Не совсем так, я использовал std::ofstream и: file ‹‹ a_full_formated_image_string; - person Rbt; 27.05.2020
comment
@Rbt См., например. stackoverflow.com/questions/28896001 / или stackoverflow.com/questions/41589811/ - person Bob__; 27.05.2020
comment
@Rbt Если вы выполняете один вызов для записи в файл одной огромной строки, числа, представляющие значения цвета в этой строке, не должны быть отформатированы как текст (например, 200 128 04), но вы должны указать фактическое значение (например, str[i] = 200; str[i + 1]= 128...). - person Bob__; 27.05.2020