Netpbm
Netpbm is an open-source package of graphics programs and a programming library. It is used mainly in the Unix world, where one can find it included in all major open-source operating system distributions, but also works on Microsoft Windows, macOS, and other operating systems.
File formats
Several graphics formats are used and defined by the Netpbm project. The portable pixmap format, the portable graymap format and the portable bitmap format are image file formats designed to be easily exchanged between platforms. They are also sometimes referred to collectively as the portable anymap format, not to be confused with the related [|portable arbitrary map format].The PBM format was invented by Jef Poskanzer in the 1980s as a format that allowed monochrome bitmaps to be transmitted within an email message as plain ASCII text, allowing it to survive any changes in text formatting. Poskanzer developed the first library of tools to handle the PBM format, Pbmplus, released in 1988. It mainly contained tools to convert between PBM and other graphics formats. By the end of 1988, Poskanzer had developed the PGM and PPM formats along with their associated tools and added them to Pbmplus. The final release of Pbmplus was December 10, 1991.
In 1993, the Netpbm library was developed to replace the unmaintained Pbmplus. It was simply a repackaging of Pbmplus with additions and fixes submitted by people all over the world.
Description
Each file starts with a two-byte magic number that identifies the type of file it is and its encoding. The magic number is a capital P followed by a single-digit number.A value of
P7
refers to the [|PAM] file format that is covered as well by the netpbm library.The ASCII formats allow for human readability and easy transfer to other platforms; the binary formats are more efficient in file size but may have native byte-order issues.
In the binary formats, PBM uses 1 bit per pixel, PGM uses 8 or 16 bits per pixel, and PPM uses 24 bits per pixel: 8 for red, 8 for green, 8 for blue.
Conventionally PGM stores values in linear color space, but depending on application, it often use sRGB or simplified gamma representation. The file data doesn't store information which color space it is using, and must be chosen by the user or other software. 16-bit PGM almost always is stored as linear, as gamma correction is usually advantageous only in 8-bit formats.
Usually 8-bit PPM format stores colors in nonlinear format, conventionally CIE Rec. 709 for red, green and blue, adjusted by the CIE Rec. 709 gamma transfer function. However it is very common to store color using sRGB color space, or sometimes using linear color space. There is no metadata in the file to indicate which format is being used.
PBM example
A simple example of the PBM format is as follows :P1
# This is an example bitmap of the letter "J"
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
The string P1 identifies the file format. The number sign introduces a comment. The next two numbers give the width and the height. Then follows the matrix with the pixel values.
It is not required that pixels are nicely lined up, the format ignores whitespaces and linefeeds in the data section, although it's recommended that no line is longer than 76 characters. The following displays the same image:
P1
# This is an example bitmap of the letter "J"
6 10
000010000010000010000010000010000010100010011100000000000000
Here is the resulting image:
Here it is again magnified 20 times:
Note that a 0 signifies a white pixel, and a 1 signifies a black pixel. This is in contrast to the other formats, where higher values signify brighter pixels.
The P4 binary format of the same image represents each pixel with a single bit, packing 8 pixels per byte, with the first pixel as the most significant bit. Extra bits are added at the end of each row to fill a whole byte.
PGM example
The PGM and PPM formats have an additional parameter for the maximum value after the X and Y dimensions and before the actual pixel data. Black is 0 and max value is white. There is a newline character at the end of each line.P2
# Shows the word "FEEP"
24 7
15
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 3 3 3 3 0 0 7 7 7 7 0 0 11 11 11 11 0 0 15 15 15 15 0
0 3 0 0 0 0 0 7 0 0 0 0 0 11 0 0 0 0 0 15 0 0 15 0
0 3 3 3 0 0 0 7 7 7 0 0 0 11 11 11 0 0 0 15 15 15 15 0
0 3 0 0 0 0 0 7 0 0 0 0 0 11 0 0 0 0 0 15 0 0 0 0
0 3 0 0 0 0 0 7 7 7 7 0 0 11 11 11 11 0 0 15 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
PPM example
This is an example of a color RGB image stored in PPM format. There is a newline character at the end of each line.P3
3 2
255
# The part above is the header
# "P3" means this is a RGB color image in ASCII
# "3 2" is the width and height of the image in pixels
# "255" is the maximum value for each color
# The part below is image data: RGB triplets
255 0 0 # red
0 255 0 # green
0 0 255 # blue
255 255 0 # yellow
255 255 255 # white
0 0 0 # black
The P6 binary format of the same image represents each color component of each pixel with one byte in the order red, green, then blue. The file is smaller, but the color information is difficult to read by humans. The header remains in ASCII and the arguments are still separated by a whitespace. The binary image information comes after the header.
The PPM format is not compressed, and thus requires more space and bandwidth than a compressed format would. For example, the above 192×128 PNG image has a file size of 166 bytes. When converted to a 192×128 PPM image, the file size is 73,848 bytes. The PPM format is generally an intermediate format used for image work before converting to a more efficient format, for example the PNG format, without any loss of information in the intermediate step.
The image shown above using only 0 or the maximal value for the red-green-blue channels can be also encoded as:
P33 2 1
- The same image with width 3 and height 2,
- using 0 or 1 per color
1 0 0 0 1 0 0 0 1
1 1 0 1 1 1 0 0 0
White space including line ends and comment lines is syntactically equivalent to a single space within the PNM headers. For the plain formats P1...P3 this also affects the pixmap lines; in fact lines should be limited to 70 characters:
P3 3 2 1 1 0 0 0 1 0 0 0 1 1 1 0 1 1 1 0 0 0
16-bit extensions
The original definition of the PGM and the PPM binary formats did not allow bit depths greater than 8 bits. While the ASCII format can accommodate greater bit depths, it increases file size and thus slows read and write operations. Accordingly, many programmers extended the format to allow higher bit depths. Using higher bit depths encounters the problem of having to decide on the endianness of the file. The various implementations could not agree on which byte order to use, and some connected the 16-bit endianness to the pixel packing order. In Netpbm, the de facto standard implementation of the PNM formats, the most significant byte is first.32-bit extensions
The PFM is the unofficial four byte IEEE 754 single precision floating point extension. A color file is identified with the ASCII text "PF" in the first line of the header and a gray-scale with "Pf". The next ASCII text line contains the width and height, separated by the space character hex 20 and sometimes with hex 0A. After each line a white space character hex 0A is written and not the Windows/DOS CR/LF combination. The third ASCII text line indicates with a negative number a little endian float en a positive number a big-endian float. The absolute value of the number indicates the range. So the third line containing -1.0 indicates little-endian format in range zero to one. There are no comments. After the header the file proceeds with floating point numbers for each pixel, specified in left to right, bottom to top order. Some programs suggest PF4 as an additional extension for the RGBA format.It's supported by the programs Photoshop and Gimp.
Programs
Netpbm contains over 220 separate programs in the package, most of which have "pbm", "pgm", "ppm", "pam", or "pnm" in their names. For example, one might use pamscale to shrink an image by 10%, pamcomp to overlay one image on top of another, pbmtext to create an image of text or reduce the number of colors in an image with pnmquant.The programs are designed to be minimal building blocks that can be used in various combinations to do other things. The Netpbm package can, for example, use two successive conversion programs to turn a picture in the PBM format into a.bmp file:
pgmtoppm "#FFFFFF" somepic.pbm > somepic.ppm
ppmtobmp somepic.ppm > somepic.bmp
This is more commonly done as a pipeline, to save execution time and to avoid
leaving a temporary somepic.ppm file around:
pgmtoppm "#FFFFFF" somepic.pbm | ppmtobmp > somepic.bmp
The Netpbm programs are frequently used as intermediates to convert between obscure formats. For instance, there may be no tool to convert an X11 window dump directly to a Macintosh PICT file, but one can do this by running xwdtopnm, then ppmtopict. As a more complex example, Netpbm tools can convert 48×48 XBM to Ikon and eventually X-Face.
History
The PBM format was invented by Jef Poskanzer in the mid-1980s. At the time, there was no standard, reliable way to send binary files in email, and attempting to send anything other than 7-bit ASCII in email often resulted in data corruption. PBM was designed to allow images to be sent via email without being corrupted. Poskanzer released the forerunner of Netpbm, called Pbmplus in 1988. By the end of 1988, Poskanzer had developed the PGM and PPM formats and released them with Pbmplus.The last release of Pbmplus was on December 10, 1991. Poskanzer never released any further updates, and in 1993, Netpbm was developed to replace it. At first, it was nothing more than a renamed release of Pbmplus, but updates continued to occur until 1995 when the package again became abandoned. In 1999, the Netpbm package was picked up by its present maintainer, Bryan Henderson.
In 2000, PAM was added to the file formats of the Netpbm library allowing an alpha channel.
The name Netpbm came from the program developers collaborating over the Internet, which was notable at the time; the NetBSD operating system and NetHack game got their names similarly.
PAM graphics format
Portable Arbitrary Map is an extension of the older binary P4...P6 graphics formats. PAM generalises all features of PBM, PGM and PPM, and provides for extensions. PAM defines two new attributes; depth and tuple type:- The depth attribute defines the number of channels in the image, such as 1 for greyscale images and 3 for RGB images.
- The tuple type attribute specifies what kind of image the PAM file represents, thus enabling it to stand for the older Netpbm formats, as well as to be extended to new uses, e.g., [|transparency].
TUPLTYPE
is optional; however, FFmpeg requires it.Differences from the older formats
The header for the PAM file format begins with P7, and ends in an explicit close: ENDHDR. Line ends in a PAM header are significant; for PNM, line ends are white space.There is no plain version of PAM. PAM files are always binary, and attempts to use the switch
-plain
with Netpbm programs that produce PAM output results in an error message.For the black-and-white version of PAM, corresponding to PBM, PAM uses one byte per pixel, instead of PBM's use of one bit per pixel. Also, the value 1 in such a PAM image stands for white, as opposed to black in PBM.
TUPLTYPE | MAXVAL | DEPTH | comment |
BLACKANDWHITE | 1 | 1 | special case of GRAYSCALE |
GRAYSCALE | 2...65535 | 1 | 2 bytes per pixel for MAXVAL > 255 |
RGB | 1...65535 | 3 | 6 bytes per pixel for MAXVAL > 255 |
BLACKANDWHITE_ALPHA | 1 | 2 | 2 bytes per pixel |
GRAYSCALE_ALPHA | 2...65535 | 2 | 4 bytes per pixel for MAXVAL > 255 |
RGB_ALPHA | 1...65535 | 4 | 8 bytes per pixel for MAXVAL > 255 |
Transparency
All of the basic tuple types have a variant with an opacity channel. The tuple type is created by appending "_ALPHA" as a suffix to the base tuple type.For example, an image with a tuple type of GRAYSCALE is equivalent to PGM. GRAYSCALE_ALPHA with transparency is not directly possible in PGM. The specification permits MAXVAL 1 for GRAYSCALE, but it would have the same effect as BLACKANDWHITE.
An example in the BMP article shows an RGBA image with 4×2=8 blue, green, red, and white pixels; half transparent in the first lower row, opaque in the second upper row; hex.
FF00007F 00FF007F 0000FF7F FFFFFF7F FF0000FF 00FF00FF 0000FFFF FFFFFFFF
in BGRA order. For PAM, this bitmap has to be given in RGBA order, swapping the 1st and 3rd byte in each pixel. BMP rows are typically arranged bottom-up, for PAM and PNM rows are given top-down. The PAM header for this example could be:P7
WIDTH 4
HEIGHT 2
DEPTH 4
MAXVAL 255
TUPLTYPE RGB_ALPHA
ENDHDR
Extensions
PAM's tuple-type mechanism allows for many extensions. In theory, PAM can be extended to represent colour models such as CMYK.The format is not even limited to graphics, its definition allowing it to be used for arbitrary three-dimensional matrices of unsigned integers. Some programs of the Netpbm package, for example pamsummcol, function as crude matrix arithmetic processors and use the PAM format this way.