Netpbm (ранее Pbmplus) — это пакет графических программ с открытым исходным кодом и библиотека программирования. Он используется в основном в мире Unix , где его можно найти включенным во все основные дистрибутивы операционных систем с открытым исходным кодом , но также работает в Microsoft Windows , macOS и других операционных системах. [3]
Проект Netpbm использует и определяет несколько графических форматов:
являются форматами файлов изображений, разработанными для легкого обмена между платформами. Иногда их также называют портативным форматом anymap ( PNM ), [7] [8] не путать с родственным портативным произвольным форматом карты (PAM). «Магическое число» (Px) в начале файла определяет тип, а не расширение файла, хотя лучше всего использовать правильное расширение, если это возможно.
Формат PBM был изобретен Джефом Посканцером в 1980-х годах как формат, позволяющий передавать монохромные растровые изображения в сообщениях электронной почты в виде обычного текста ASCII, что позволяет им сохраняться при любых изменениях в форматировании текста. [8] Посканцер разработал первую библиотеку инструментов для работы с форматом PBM, Pbmplus, выпущенную в 1988 году. Она в основном содержала инструменты для преобразования между PBM и другими графическими форматами. К концу 1988 года Посканцер разработал форматы PGM и PPM вместе с соответствующими инструментами и добавил их в Pbmplus. Окончательный выпуск Pbmplus состоялся 10 декабря 1991 года.
В 1993 году была разработана библиотека Netpbm для замены неподдерживаемого Pbmplus. Это была просто переупаковка Pbmplus с дополнениями и исправлениями, присланными людьми со всего мира. [1]
Каждый файл начинается с двухбайтового магического числа (в ASCII), которое идентифицирует тип файла (PBM, PGM и PPM) и его кодировку ( ASCII /"plain" или binary/"raw"). Магическое число представляет собой заглавную букву P, за которой следует однозначное число.
Значение P7
относится к формату файла PAM, который также поддерживается библиотекой netpbm. [9]
Форматы ASCII («простые») обеспечивают удобство чтения человеком и простую передачу на другие платформы; двоичные («сырые») форматы легче анализируются программами и более эффективны с точки зрения размера файла.
В двоичных форматах PBM использует 1 бит на пиксель, PGM использует 8 или 16 бит на пиксель, а PPM использует 24 или 48 бит на пиксель: 8/16 для красного, 8/16 для зеленого, 8/16 для синего. Поддержка приложений для 16-битных вариантов все еще редка.
Документация PGM и PPM определяет, что серые и цветные значения используют цветовое пространство BT.709 и функцию передачи гаммы . Однако в зависимости от приложения используемое цветовое пространство может быть sRGB , линейным или каким-либо другим цветовым пространством . В файле нет метаданных, указывающих, какое цветовое пространство используется.
Ниже приведен простой пример формата PBM. (Символ(ы) новой строки в конце каждой строки не показаны.):
П1# Это пример растрового изображения буквы "J"6 100 0 0 0 1 00 0 0 0 1 00 0 0 0 1 00 0 0 0 1 00 0 0 0 1 00 0 0 0 1 01 0 0 0 1 00 1 1 1 0 00 0 0 0 0 00 0 0 0 0 0
Строка P1 идентифицирует формат файла. Знак числа вводит комментарий. Следующие два числа задают ширину и высоту. Затем следует матрица со значениями пикселей (в монохромном случае здесь только нули и единицы).
Не требуется, чтобы пиксели были аккуратно выровнены, формат игнорирует пробелы и переводы строк в разделе данных, хотя рекомендуется, чтобы ни одна строка не была длиннее 76 символов. Ниже показано то же изображение:
П1# Это пример растрового изображения буквы "J"6 100000100000100000100000100000100000101000100111100000000000000
Вот получившееся изображение:
Вот оно снова увеличено в 20 раз:
Значение 0 означает белый пиксель, а 1 означает черный пиксель. Это отличается от других форматов, где более высокие значения означают более яркие пиксели.
Двоичный формат P4 того же изображения представляет каждый пиксель одним битом. Ширина строки составляет пикселей, упакованных в длину 8 пикселей или байт. Первый пиксель в строке — это старший бит. Дополнительные биты, используемые для придания длине байта, игнорируются. Для расчета количества требуемых байтов можно использовать следующую формулу: ⌈ width / 8⌉ * height . Если использовать пример выше, ⌈6 / 8⌉ * 10 будет 10 байт.
П4# Это пример двоичного формата буквы "J" с каждым байтом в десятичной системе счисления6 108 8 8 8 8 8 136 112 0 0
Форматы PGM и PPM (как ASCII, так и двоичные версии) имеют дополнительный параметр для максимального значения (количество оттенков серого между черным и белым) после измерений X и Y и перед фактическими данными пикселей. Черный цвет равен 0, а максимальное значение — белому. (Символ(ы) новой строки в конце каждой строки не показаны.)
П2# Показывает слово "FEEP"24 7150 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 3 3 3 3 0 0 7 7 7 7 0 0 11 11 11 11 0 0 15 15 15 15 00 3 0 0 0 0 0 7 0 0 0 0 0 11 0 0 0 0 0 15 0 0 15 00 3 3 3 0 0 0 7 7 7 0 0 0 11 11 11 0 0 0 15 15 15 15 00 3 0 0 0 0 0 7 0 0 0 0 0 11 0 0 0 0 0 15 0 0 0 00 3 0 0 0 0 0 7 7 7 7 0 0 11 11 11 11 0 0 15 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Это пример цветного изображения RGB, сохраненного в формате PPM. (Символ(ы) новой строки в конце каждой строки не показаны.)
П3# "P3" означает, что это цветное изображение RGB в ASCII# "3 2" — ширина и высота изображения в пикселях# "255" — максимальное значение для каждого цвета# Это, вплоть до строки «255» ниже, заголовок.# Все, что находится после этого, — это данные изображения: триплеты RGB.# По порядку: красный, зеленый, синий, желтый, белый и черный.3 2255255 0 0 0 255 0 0 0 255255 255 0255 255 255 0 0 0
Двоичный формат P6 того же изображения представляет каждый цветовой компонент каждого пикселя одним байтом (таким образом, три байта на пиксель) в порядке красный, зеленый, затем синий. Файл меньше, но цветовая информация более сложна для чтения человеком. Заголовок остается в ASCII, а аргументы по-прежнему разделяются пробелом. Двоичная информация об изображении идет после заголовка (который заканчивается пробелом).
В двоичном формате последняя строка заголовка должна иметь вид «255\n», а данные должны следовать сразу за ней; любой комментарий, добавленный после 255, будет воспринят как начало данных изображения, а изображение будет смещено вправо (по крайней мере, при открытии в программе для обработки изображений GIMP (декабрь 2022 г.)).
Формат PPM не сжимается, поэтому требует больше места и пропускной способности, чем сжатый формат. Например, указанное выше изображение 192×128 PNG ( Portable Network Graphics ) имеет размер файла 166 байт. При преобразовании в изображение 192×128 PPM размер файла составляет 73 848 байт. Коэффициент уменьшения размера файла 100 или около того при преобразовании в png является типичным, если изображение представляет собой линейный рисунок; если изображение представляет собой фотографию, его лучше всего преобразовать в jpeg, что обеспечивает большее уменьшение размера файла.
Формат PPM обычно является промежуточным форматом, используемым для работы с изображениями перед конвертацией в более эффективный формат, например, формат PNG, без потери информации на промежуточном этапе.
Изображение, показанное выше, использующее только 0 или максимальное значение для каналов красный - зеленый - синий , можно также закодировать следующим образом:
П3# То же изображение шириной 3 и высотой 2,# используя 0 или 1 для каждого цвета (красный, зеленый, синий)3 2 11 0 0 0 1 0 0 0 11 1 0 1 1 1 0 0 0
Пробелы, включая концы строк и строки комментариев, синтаксически эквивалентны одному пробелу в заголовках PNM. Для простых форматов P1...P3 это также влияет на строки pixmap; фактически строки должны быть ограничены 70 символами:
P3 3 2 1 1 0 0 0 1 0 0 0 1 1 1 0 1 1 1 0 0 0
Первоначальное определение двоичных форматов PGM и PPM (форматы P5 и P6) не допускало битовой глубины более 8 бит. Хотя формат ASCII может поддерживать большую битовую глубину, он увеличивает размер файла и, таким образом, замедляет операции чтения и записи. Соответственно, многие программисты расширили формат, чтобы разрешить большую битовую глубину. Использование большей битовой глубины сталкивается с проблемой необходимости принятия решения о порядке байтов файла . Различные реализации не пришли к согласию относительно того, какой порядок байтов использовать, и некоторые связывали 16-битовый порядок байтов с порядком упаковки пикселей. [10] Текущая документация PGM и PPM гласит, что наиболее значимый байт является первым, а реализация Netpbm также использует порядок байтов big-endian. [11]
PFM (Portable Floatmap) — это неофициальное четырехбайтовое расширение IEEE 754 для чисел с плавающей точкой одинарной точности. [12] [13] [14]
После заголовка файл продолжается числами с плавающей точкой для каждого пикселя, указанными слева направо, снизу вверх. Некоторые программы предлагают PF4 как дополнительное расширение для формата RGBA. [15]
PFM поддерживается программами Photoshop , [16] GIMP и ImageMagick . Поддерживается фактической эталонной реализацией netpbm. [12]
Пакет Netpbm содержит более 350 программ, [17] большинство из которых имеют в своих названиях "pbm", "pgm", "ppm", "pam" или "pnm". Например, можно использовать pamscale
для уменьшения изображения на 10%, pamcomp
для наложения одного изображения на другое, pbmtext
для создания изображения текста или уменьшения количества цветов в изображении с помощью pnmquant
.
Программы разработаны как минимальные строительные блоки, которые могут использоваться в различных комбинациях для выполнения других задач. Пакет Netpbm может, например, использовать две последовательные программы преобразования для преобразования цветного изображения в формате GIF в файл .bmp :
giftopnm somepic.gif > somepic.ppmppmtobmp somepic.ppm > somepic.bmp
Чаще всего это делается в виде конвейера , чтобы сэкономить время выполнения и не оставлять временный файл somepic.ppm :
giftopnm somepic.gif | ppmtobmp > somepic.bmp
Программы Netpbm часто используются в качестве промежуточных звеньев для преобразования между малоизвестными форматами. Например, может не быть инструмента для преобразования дампа окна X11 ( формат XWD ) непосредственно в файл Macintosh PICT , но это можно сделать, запустив xwdtopnm
, затем ppmtopict
. (Инструменты, которые говорят, что они выводят PNM, выводят либо PBM, PGM, либо PPM. Инструменты, импортирующие PNM, будут читать любой из трех форматов.) В качестве более сложного примера, инструменты Netpbm могут преобразовывать 48×48 XBM в Ikon и, в конечном итоге, X-Face . [18]
Формат PBM (черно-белый) был изобретен Джефом Посканцером в середине 1980-х годов. В то время не существовало стандартного надежного способа отправки двоичных файлов по электронной почте, и попытка отправить что-либо, кроме 7-битного ASCII, по электронной почте часто приводила к повреждению данных . PBM был разработан, чтобы позволить отправлять изображения по электронной почте без повреждения. Poskanzer выпустил предшественника Netpbm, названного Pbmplus , в 1988 году. К концу 1988 года Poskanzer разработал форматы PGM (оттенки серого) и PPM (цветной) и выпустил их вместе с Pbmplus.
Последний релиз Pbmplus состоялся 10 декабря 1991 года. Poskanzer больше не выпускал обновлений, и в 1993 году был разработан Netpbm, чтобы заменить его. Сначала это был не более чем переименованный релиз Pbmplus, но обновления продолжали выходить до 1995 года, когда пакет снова был заброшен. В 1999 году пакет Netpbm был взят его нынешним сопровождающим, Брайаном Хендерсоном.
В 2000 году PAM был добавлен в форматы файлов библиотеки Netpbm, допускающие альфа-канал. [19]
Название Netpbm произошло от сотрудничества разработчиков программ через Интернет , что было примечательно в то время; операционная система NetBSD и игра NetHack получили свои названия аналогичным образом. (В отличие от более позднего, более распространенного формата Portable Network Graphics (PNG), «net» в названии на самом деле не относится к самому изображению, оптимизированному для передачи по сети.)
Portable Arbitrary Map ( PAM ) — это расширение старых бинарных графических форматов P4...P6 , представленное в netpbm версии 9.7 (август 2000 г.). PAM обобщает все возможности PBM, PGM и PPM и обеспечивает расширения. PAM определяет два новых атрибута: глубину и тип кортежа :
PAM поддерживается XnView и FFmpeg . [21] [22] Как указано, это TUPLTYPE
необязательно, однако FFmpeg требует этого.
Заголовок для формата файла PAM начинается с P7 и (в отличие от других форматов) заканчивается явным закрытием: "ENDHDR" с последующим пробелом. Концы строк в заголовке PAM имеют значение; для PNM концы строк являются пробелами.
Не существует простой (человечески читаемой, на основе ASCII ) версии PAM. Файлы PAM всегда являются двоичными, и попытки использовать коммутатор -plain
с программами Netpbm, которые производят вывод PAM, приводят к сообщению об ошибке.
Для черно-белой версии PAM (глубина 1, тип кортежа BLACKANDWHITE), соответствующей PBM, PAM использует один байт на пиксель, вместо использования PBM одного бита на пиксель (упаковка восьми пикселей в один байт). Кроме того, значение 1 в таком изображении PAM обозначает белый цвет («light on»), в отличие от черного в PBM («ink on»).
Все основные типы кортежей (BLACKANDWHITE, GRAYSCALE и RGB) имеют вариант с каналом непрозрачности . Тип кортежа создается путем добавления "_ALPHA" в качестве суффикса к базовому типу кортежа.
Например, изображение с типом кортежа GRAYSCALE эквивалентно PGM (portable graymap). GRAYSCALE_ALPHA с прозрачностью напрямую невозможен в PGM. Спецификация допускает MAXVAL 1 для GRAYSCALE, но это будет иметь тот же эффект, что и BLACKANDWHITE.
Пример в статье BMP показывает изображение RGBA с 4×2=8 синими, зелеными, красными и белыми пикселями; полупрозрачный (0x7F) в первой нижней строке, непрозрачный (0xFF) во второй верхней строке; шестнадцатеричный в порядке BGRA . Для PAM этот битмап должен быть задан в порядке RGBA , поменяв местами 1-й и 3-й байты в каждом пикселе. Строки BMP обычно располагаются снизу вверх, для PAM и PNM строки задаются сверху вниз (т. е. для этого примера ). Заголовок PAM для этого примера может быть следующим:FF00007F 00FF007F 0000FF7F FFFFFF7F FF0000FF 00FF00FF 0000FFFF FFFFFFFF
0000FFFF 00FF00FF FF0000FF FFFFFFFF 0000FF7F 00FF007F FF00007F FFFFFF7F
П7ШИРИНА 4ВЫСОТА 2ГЛУБИНА 4МАКСВАЛ 255TUPLTYPE RGB_ALPHAКОНЕЦHDR
Механизм кортежного типа PAM допускает множество расширений. Теоретически PAM может быть расширен для представления цветовых моделей, таких как CMYK.
Формат даже не ограничивается графикой, его определение позволяет использовать его для произвольных трехмерных матриц беззнаковых целых чисел. Некоторые программы пакета Netpbm, например pamsummcol , функционируют как процессоры грубой матричной арифметики и используют формат PAM таким образом.
Netpbm состоит из сотен различных инструментов, каждый из которых предлагается с собственной лицензией на публичное авторское право. Анализ разработчика Debian Стива Макинтайра от 2001 года предполагает в основном лицензии на свободное программное обеспечение, одну некоммерческую лицензию (несвободную) и дюжину без какой-либо лицензии (следовательно, также несвободных). Как упоминалось в анализе, он, очевидно, не охватывает изменения с тех пор. [23]
Добавлен формат PAM