Технологии

Почему PPM любят в программировании и обработке изображений

Формат, который проигрывает по всем «бытовым» параметрам — тяжёлый, без сжатия, не открывается двойным кликом — почему-то остаётся любимцем разработчиков и инженеров обработки изображений. Секрет в одном слове: простота. Разберём, как PPM стал «общим языком» утилит командной строки, почему его выбирают для генерации картинок и как вывести изображение в него буквально за десяток строк кода.

Среда разработки с открытым кодом — PPM это формат, рождённый для программистов
Для разработчика PPM — это не картинка, а удобная структура данных. Фото: Pexels

Простота как суперсила

Чтобы понять любовь программистов к PPM, нужно встать на их место. Для разработчика картинка — это не «фотография», а массив чисел: набор пикселей, у каждого из которых есть красный, зелёный и синий компоненты. И PPM хранит именно это, без всякой обёртки.

Сравните с PNG или JPG: чтобы их прочитать, программе нужен специальный готовый «распаковщик» (его пишут заранее и подключают к программе), который умеет разбирать сложное сжатие. А PPM можно прочитать и записать самому, без единой зависимости. Заголовок — обычный текст, данные — просто числа. Если интересно, как именно устроен формат изнутри, есть базовая статья «Что такое PPM».

Главная мысль

Для пользователя ценность формата — в маленьком размере. Для программиста ценность — в том, что формат можно разобрать без библиотек. По второму критерию PPM почти не имеет конкурентов.

Общий язык командной строки

В мире Unix-утилит есть негласный «общий язык», на котором программы передают друг другу изображения. И этот язык — PPM (а шире, всё семейство PNM). Почему именно он? Потому что его умеют читать и писать абсолютно все графические инструменты, без исключений и без согласования кодеков.

Это как обмен данными через простой текстовый файл вместо проприетарного формата: пусть громоздко, зато гарантированно совместимо. Одна программа выдаёт картинку в формате PPM и тут же передаёт её следующей программе по цепочке — и всё работает без лишних настроек.

Терминал и редактор кода рядом — утилиты обмениваются данными через PPM
В пайплайнах одна утилита передаёт PPM другой как простой поток байтов. Фото: Pexels

Пайплайны: ImageMagick, dcraw, ffmpeg

Вот где PPM раскрывается во всю мощь. Перечислим главных «потребителей» формата:

  • ImageMagick и GraphicsMagick — швейцарские ножи обработки изображений. Они используют PNM как универсальный промежуточный формат между этапами обработки.
  • dcraw — легендарный инструмент для проявки RAW-файлов с фотокамер. На выходе он часто отдаёт именно PPM — самый простой формат, который точно прочитает следующий инструмент в цепочке.
  • ffmpeg — комбайн для видео. Может разбирать видео на отдельные кадры в PPM и собирать видео обратно из последовательности PPM-картинок.
  • Утилиты Netpbm — десятки маленьких программ (повернуть, обрезать, изменить контраст), каждая делает одну операцию и общается с другими через PNM.

Есть и ещё одно тонкое преимущество: PPM хорошо «течёт» потоком. Инструмент может обрабатывать картинки по одной, не загружая в память сразу всю последовательность — критично, когда речь о тысячах кадров видео.

Почему именно «сырой» формат удобен

Когда программе нужно быстро добраться до пикселей, отсутствие сжатия — это плюс: не тратится время на распаковку. Поэтому в пайплайнах «тяжёлый» PPM на промежуточных шагах часто быстрее «лёгкого» PNG.

Генерация картинок в десяток строк

Самый осязаемый пример любви к PPM — это генерация изображений. Допустим, вы пишете трассировщик лучей (ray tracer) или фрактал и хотите сохранить результат в картинку. С PNG пришлось бы подключать библиотеку. С PPM — достаточно встроенного вывода в файл.

Алгоритм буквально такой: напечатать заголовок, а затем в двойном цикле по строкам и столбцам вывести для каждого пикселя три числа. Вот как выглядит генерация плавного градиента в псевдокоде. Дальше — пример для тех, кто пишет код; если программирование вам незнакомо, просто пропустите этот блок — текст под ним всё объясняет словами:

# Печатаем заголовок: текстовый PPM, размер 256x256, максимум 255
print("P3")
print("256 256")
print("255")

# Для каждого пикселя печатаем R G B
for y in range(256):
    for x in range(256):
        r = x          # красный растёт слева направо
        g = y          # зелёный растёт сверху вниз
        b = 128        # синий постоянный
        print(r, g, b)

И всё — на экране получится красивый градиент. Именно поэтому почти каждый учебник по компьютерной графике (включая знаменитый Ray Tracing in One Weekend) начинается с вывода в PPM: не нужно отвлекаться на библиотеки, можно сразу заниматься сутью.

~10строк кода на вывод PPM
0внешних библиотек нужно
16 битточность для науки
Код с алгоритмами на экране — генерация изображения в PPM это вывод чисел в файл
Сгенерировать картинку в PPM — значит просто напечатать числа в файл по порядку. Фото: Pexels

PPM в обучении и науке

Два мира особенно ценят PPM. Первый — образование: на нём удобно учить основам растровой графики, потому что студент видит прямую связь «число → пиксель» без скрытой магии сжатия. Второй — научная визуализация: здесь важна точность.

И тут у PPM есть козырь — поддержка 16 бит на канал. Если в заголовке указать maxval больше 255 (вплоть до 65535), каждый канал займёт 2 байта, и можно хранить куда более тонкие градации яркости, чем позволяет 8-битный JPG. Для астрономии, медицинских снимков и обработки RAW это принципиально. О том, чем PPM отличается от сжатых форматов по размеру, читайте в статье «PPM против PNG и BMP», а про устройство магических чисел — в материале о семействе Netpbm.

Финальный шаг: из PPM в нормальный формат

У всей этой простоты есть закономерный финал. Когда обработка закончена и нужно показать результат человеку, выложить в сеть или просто сэкономить место — PPM конвертируют в обычный формат. Чаще всего в PNG (сжатие без потерь, качество не страдает) или в JPG (если это фотография и важен минимальный вес).

Сгенерировали PPM — превратите его в PNG

Конвертер FormatZ заберёт «сырой» результат вашего кода и отдаст компактный PNG за пару секунд, прямо в браузере. Без установки и регистрации.

Конвертировать PPM в PNG

А если, наоборот, нужно превратить готовую картинку в «сырые» пиксели для своего кода — пригодится обратное преобразование PNG → PPM. Все доступные конвертации собраны на странице всех форматов.

PPM — это не формат для красоты. Это формат для работы: когда нужно, чтобы пиксели прочитала любая программа без лишних слов.
PNG требует библиотеки-кодека: его сжатие сложно реализовать вручную. PPM же можно прочитать и записать самому буквально за десяток строк кода, без зависимостей. Когда нужен быстрый и предсказуемый формат для своих экспериментов или промежуточного шага, простота PPM перевешивает его большой размер.
PPM — негласный «общий язык» утилит командной строки. Через него обмениваются данными ImageMagick, GraphicsMagick, dcraw (обработка RAW с камер), набор Netpbm и ffmpeg. Одна программа выдаёт PPM, другая его читает — никаких кодеков и согласований не нужно.
Очень просто. Нужно напечатать заголовок (P3 или P6, ширину, высоту и maxval), а затем в цикле вывести для каждого пикселя три числа: красный, зелёный, синий. Это делается на любом языке за несколько строк, что идеально для учебных проектов и трассировщиков лучей.
Да. Если значение maxval в заголовке больше 255 (и до 65535), каждый канал занимает 2 байта вместо одного, старший байт первым. Это позволяет хранить 16-битную точность — важно в научной визуализации и при обработке RAW, где 8 бит JPG недостаточно.
Поскольку PPM не сжат и не открывается обычными программами, финальный результат почти всегда конвертируют в PNG (без потерь) или JPG (для фото). Это легко сделать онлайн в конвертере FormatZ, не выходя из браузера.