PPM
Материал из OSZone.net wiki.
Простые форматы хранения изображений portable pixmap (иногда определяемые, как PNM): цветных (PPM), полутоновых (PGM) и черно-белых (PBM) определяют правила для обмена графическими файлами. Эти форматы обеспечивают базовую функциональность и служат наименьшим общим знаменателем при конвертации графических файлов типов pixmap, graymap или bitmap между разными платформами. Некоторые приложения поддерживают этот формат напрямую, определяя их, как формат PNM (portable anymap). Формат PPM был разработан Джефом Посканзером (англ.Jeff Poskanzer).
Содержание |
Использование в Netpbm
Пакет Netpbm может, например, использовать последовательно две программы конвертации для превращения этого кода в файл bmp:
pgmtoppm "#FFFFFF" j.pbm > j.ppm ppmtobmp j.ppm > j.bmp
В зависимости от распознанного формата файла, система простых графических файлов portable pixmap может различать три сходных формата файлов, каждый в двух версиях:
- PBM — черно-белый (portable bitmap) (P1/P4) — 1 бит на пиксел
- PGM — полутоновый (portable graymap) (P2/P5) — 8 бит на пиксел
- PPM — цветной (portable pixmap) (P3/P6) — 24 бит на пиксел, 8 на красный, 8 на зеленый, 8 на синий
В каждом случае нижняя версия (P1, P2 или P3) относятся к удобочитаемым, основанным на ASCII форматам, сходным с показанным на примере в этой статье. А верхние версии (P4, P5 и P6) относятся к бинарным форматам, менее удобным для разбора, но более эффективным для экономии места в файле и более удобным для разбора из-за отсутствия пробелов.
Если Вы щете возможность конвертации фалойв PDF в растровые форматы, xPDf предоставляет такую возможность. Это свободнораспространяемый инструмент pdftoppm. Используя его, можно экспортировать файлы PDF в рисунки формата PPM.
Описание формата файла
Разберем пример битмапа, рисующего букву «J» :
....X. ....X. ....X. ....X. ....X. ....X. X...X. .XXX.. ...... ......
Самый базовый (монохромный) формат PBM представляет этот пример в следующем виде:
P1 # This is an example bit map file j.pbm 6 10 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Строка P1 определяет формат файла. Знак решетки (#) отделяет комментарий . Следующие два числа задают ширину и высоту. Затем следует матрица значений пикселов (в случае монохромного изображения, как в этом примере, — только нули и единицы).
Результирующее изображение:
. Оно же, увеличенное в 20 раз:
16-и битное расширение
Изначально бинарные форматы PGM и PPM (P5 и P6) поддерживали битовую глубину не более 8 бит. Конечно, можно было использовать форматы ASCII, но при их использовании увеличивается размер и замедляется чтение файлов. В результате многие разработчики пытались расширить формат для поддержки большей битовой глубины. При использовании большей глубины, мы сталкиваемся с проблемой порядка байтов (Endianness) в файле. К сожалению, различные приложения не согласованы в каком-либо одном следовании порядка байтов (Endianness). Netpbm при работе с PNM de facto использует порядок от старшего к младшему (big-endian).
Пример PPM
P3 # P3 обозначает, что цвета даны в ascii, затем цифры, обозначающие число колонок и рядов (3 колонки и 2 ряда), затем 255 для максимального значения цвета, затем триплеты RGB 3 2 255 255 0 0 0 255 0 0 0 255 255 255 0 255 255 255 0 0 0
Это изображение было развернуто без интерполяции, при помощи команды imagemagick:
convert -sample %6400 tiny6pixel.ppm tiny6pixel.png
Формат P6 для этого же изображения будет хранить цвет в одном байте. Файл будет меньше, но информация о цвете не будет восприниматься человеком:
P6
#тут возможна строка комментариев
3 2
255
!@#$%^&*()_+|{}:"<
The PPM format is not compressed and so is extravagantly wasteful of space and bandwidth. For example, the above 192x128 PNG image has a file size of 552 bytes. When converted to a 192x128 PPM image, the file size is 73848 bytes. The PPM format is generally a vehicle to a more efficient format, notably the PNG (Portable Network Graphics) format. The PPM format can be converted to PNG, for example, without loss of information.
Формат PPM достаточно прост для написания кода «from scratch». Далее приведен листинг на Python, создающий изображение, котрое мы обсуждали выше. Пример можно адаптировать.
#!/usr/bin/python
triplets=[
[255, 0, 0],
[0, 255, 0],
[0, 0, 255],
[255, 255, 0],
[255, 255, 255],
[0, 0, 0]
]
width=3
height=2
comment='any comment string'
ftype='P6' #use 'P3' for ascii, 'P6' for binary
ppmfile=open('testimage.ppm','wb')
ppmfile.write("%s\n" % (ftype))
ppmfile.write("#%s\n" % comment )
ppmfile.write("%d %d\n" % (width, height))
ppmfile.write("255\n")
if ftype=='P3':
for red,green,blue in triplets:
ppmfile.write("%d %d %d\n" % (red,green,blue))
elif ftype=='P6': #print 1 byte per color
for red,green,blue in triplets:
ppmfile.write("%c%c%c" % (red,green,blue))
ppmfile.close()
Ссылки
- Format details for the various pnm formats:

