Технологии

Семейство Netpbm: PBM, PGM, PPM и магические числа P1–P6

Почему форматов целых пять, если все они делают примерно одно? Откуда в начале каждого такого файла берутся загадочные значки вроде P1 или P6? И почему одну и ту же картинку можно записать двумя способами — «для глаз» и «для машины»? Сейчас всё разложим по полочкам. Это короткое, но плотное путешествие по самому логичному семейству форматов в истории — без воды и с конкретными примерами.

Цветной код с типами данных на экране — магические числа Netpbm задают тип файла
Магическое число в начале файла — это тип данных всего изображения. Фото: Pexels

Одно семейство, одна идея

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

Гениальность семейства в том, что все форматы устроены по одному шаблону: магическое число → размеры → (макс. значение) → данные пикселей. Зная один, вы автоматически понимаете все остальные. Меняется лишь одно: сколько информации приходится на пиксель.

Зачем разные форматы

Чёрно-белой картинке не нужны три цветовых канала — это была бы пустая трата места. Поэтому семейство даёт отдельный формат под каждый случай: бит, серый, цвет. Минимум лишнего.

Тройка форматов: PBM, PGM, PPM

В основе семейства — три формата, и отличаются они только тем, сколько цвета хранят на один пиксель:

  • PBM (Portable Bitmap) — самый аскетичный. Каждый пиксель — это 1 бит: чёрный или белый, без полутонов. Идеален для штрихкодов, факсов, чёрно-белых масок.
  • PGM (Portable Graymap) — оттенки серого. Один канал яркости на пиксель (обычно 0–255). Это «фотография без цвета».
  • PPM (Portable Pixmap) — полный цвет. Три канала на пиксель: красный, зелёный, синий. Именно его чаще всего и встречают на практике.

Заметили закономерность в названиях? Bitmap → Graymap → Pixmap. Bit, Gray, Pixel — ровно по нарастанию количества данных.

Фрагмент исходного кода крупным планом — структура форматов проста и читаема
От бита к цвету: один и тот же скелет файла, меняется лишь объём данных на пиксель. Фото: Pexels

Магические числа P1–P6

Теперь — к самому интересному. Откуда программа знает, какой именно формат перед ней? По первым двум символам файла — магическому числу. Это буква P и цифра. Всего цифр шесть, и распределены они идеально логично:

Магич. числоФорматЧто хранитВид
P1PBMЧёрно-белое (1 бит)Текст (ASCII)
P2PGMОттенки серогоТекст (ASCII)
P3PPMЦвет (RGB)Текст (ASCII)
P4PBMЧёрно-белое (1 бит)Бинарь (raw)
P5PGMОттенки серогоБинарь (raw)
P6PPMЦвет (RGB)Бинарь (raw)

Логика железная: нечётные числа (1, 2, 3) — это текстовый вариант, чётные (4, 5, 6) — бинарный. А внутри каждой пары растёт сложность цвета: бит → серый → RGB. Запомнив эту таблицу, вы расшифруете любой Netpbm-файл, просто взглянув на его первые два символа.

ASCII против binary: один формат, два лица

Самое частое недопонимание: чем «текстовый» PPM отличается от «бинарного», если картинка-то одна и та же? Разница — в способе записи тех же чисел. Посмотрим на один и тот же крошечный цветной пиксель (R=255, G=0, B=0 — чистый красный).

В текстовом варианте (P3) он выглядит так — это можно прочитать глазами:

P3
1 1
255
255 0 0

В бинарном варианте (P6) заголовок остаётся обычным текстом, а вот сами пиксели записаны уже не цифрами, а напрямую «языком компьютера» — три значения цвета идут вплотную, без пробелов и переносов строки. Глазами в Блокноте вы увидите «кракозябры», зато файл в несколько раз меньше и читается программой мгновенно.

Текст (P3): размер
Большой
Текст (P3): читаемость
Глазами
Бинарь (P6): размер
В разы меньше
Бинарь (P6): читаемость
Только программой
Байт на пиксель (P6)
3 (при maxval < 256)
Заголовок
Всегда текстовый

Про maxval и 16 бит

Число maxval в заголовке задаёт максимум яркости канала. Если оно меньше 256 — каждый канал занимает 1 байт. Если больше (до 65535) — 2 байта на канал, старший байт первым. Так PPM умеет хранить 16-битную точность для научных задач.

Структура файлов проекта и код — выбор между текстовым и бинарным вариантом
Текст или бинарь — одни и те же данные, просто записанные двумя способами. Фото: Pexels

PNM и PAM: зонтик и расширение

В документации часто встречаются ещё два имени — и они вносят путаницу, хотя всё просто.

PNM (Portable Anymap) — это не отдельный формат, а общее имя для PBM, PGM и PPM. Утилиты семейства принимают «любой из трёх» и сами разбираются по магическому числу, что именно им дали. Расширение .pnm означает «это что-то из Netpbm, разберись на месте».

PAM (Portable Arbitrary Map) с магическим числом P7 — более позднее и продвинутое расширение. У него более свободный заголовок, и он умеет хранить не только красный-зелёный-синий, но и дополнительные данные о каждом пикселе. Главное преимущество — поддержка альфа-канала (прозрачности), которой у классических PBM/PGM/PPM нет.

6магических чисел (P1–P6)
3базовых формата
P7это PAM с альфой

Какой вариант выбрать

На практике выбор простой. Для реальной работы и хранения берут бинарные варианты (P4/P5/P6) — они в разы компактнее. Текстовые (P1/P2/P3) хороши для обучения, отладки и когда хочется заглянуть в файл руками и понять, что внутри.

Но в любом случае PPM-файл не покажет браузер и не примет большинство редакторов. Поэтому финальный шаг почти всегда один — конвертация в PNG или JPG. Как именно это сделать, подробно расписано в статье «Чем открыть PPM», а сравнение PPM с PNG и BMP по размеру и сжатию — в материале «PPM против PNG и BMP».

Превратите любой Netpbm-файл в обычную картинку

Неважно, P3 у вас или P6 — конвертер FormatZ прочитает файл и отдаст компактный PNG за пару секунд, прямо в браузере.

Конвертировать PPM в PNG
Netpbm — это не пять разных форматов, а один очень логичный, у которого есть пять режимов на каждый случай жизни.
Это два первых символа файла — буква P и цифра от 1 до 6. По ним программа сразу понимает, что за формат перед ней: P1 — это чёрно-белый PBM в текстовом виде, P6 — цветной PPM в бинарном. Магическое число — паспорт файла семейства Netpbm.
Они отличаются количеством цвета на пиксель. PBM хранит только два состояния — чёрный или белый (1 бит). PGM хранит оттенки серого (один канал яркости). PPM хранит полный цвет — три канала R, G и B. Структура у всех одинаковая: заголовок плюс данные пикселей.
В текстовом варианте (нечётные числа P1, P2, P3) пиксели записаны как обычные числа, которые можно прочитать глазами. В бинарном (чётные P4, P5, P6) те же данные хранятся как сырые байты. Бинарный (то есть записанный сразу на «языке компьютера», а не обычными цифрами) вариант в несколько раз компактнее и быстрее читается программой, а текстовый — нагляднее для человека.
PNM (Portable Anymap) — это не отдельный формат, а общее название для PBM, PGM и PPM: утилита сама определяет тип по магическому числу. PAM (Portable Arbitrary Map, магическое число P7) — более новое расширение с произвольным числом каналов и поддержкой прозрачности (альфа).
Для реальной работы почти всегда берут бинарные варианты (P4/P5/P6) — они компактнее. Текстовые (P1/P2/P3) удобны для обучения, отладки и когда хочется заглянуть в файл руками. А чтобы получить картинку в обычном виде, любой из них конвертируют в PNG или JPG.