123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.3//EN">
- <html>
- <head>
- <title>PGM Format Specification</title>
- <meta name="manual_section" content="5">
- </head>
- <body>
- <h1>pgm</h1>
- Updated: 09 October 2016
- <br>
- <a href="#index">Table Of Contents</a>
- <h2>NAME</h2>
- pgm - Netpbm grayscale image format
- <h2 id="description">DESCRIPTION</h2>
- <p>This program is part of <a href="index.html">Netpbm</a>.
- <p>The PGM format is a lowest common denominator grayscale file format.
- It is designed to be extremely easy to learn and write programs for.
- (It's so simple that most people will simply reverse engineer it
- because it's easier than reading this specification).
- <p>A PGM image represents a grayscale graphic image. There are many
- pseudo-PGM formats in use where everything is as specified herein except
- for the meaning of individual pixel values. For most purposes, a PGM
- image can just be thought of an array of arbitrary integers, and all the
- programs in the world that think they're processing a grayscale image
- can easily be tricked into processing something else.
- <p>The name "PGM" is an acronym derived from "Portable Gray Map."
- <p>One official variant of PGM is the transparency mask. A transparency
- mask in Netpbm is represented by a PGM image, except that in place of
- pixel intensities, there are opaqueness values. See below.
- <h2 id="format">THE FORMAT</h2>
- <p>The format definition is as follows. You can use the <a
- href="libnetpbm.html">libnetpbm</a> C subroutine library to conveniently
- and accurately read and interpret the format.
- <p>A PGM file consists of a sequence of one or more PGM images. There are
- no data, delimiters, or padding before, after, or between images.
- <p>Each PGM image consists of the following:
- <ol>
-
- <li>A "magic number" for identifying the file type.
- A pgm image's magic number is the two characters "P5".
- <li>Whitespace (blanks, TABs, CRs, LFs).
- <li>A width, formatted as ASCII characters in decimal.
- <li>Whitespace.
- <li>A height, again in ASCII decimal.
- <li>Whitespace.
- <li>The maximum gray value (Maxval), again in ASCII decimal. Must be less
- than 65536, and more than zero.
- <li>A single whitespace character (usually a newline).
- <li>A raster of Height rows, in order from top to bottom. Each row
- consists of Width gray values, in order from left to right. Each gray
- value is a number from 0 through Maxval, with 0 being black and Maxval
- being white. Each gray value is represented in pure binary by either
- 1 or 2 bytes. If the Maxval is less than 256, it is 1 byte.
- Otherwise, it is 2 bytes. The most significant byte is first.
- <p>A row of an image is horizontal. A column is vertical. The pixels
- in the image are square and contiguous.
- <p>Each gray value is a number proportional to the intensity of the
- pixel, adjusted by the ITU-R Recommendation BT.709 gamma transfer
- function. (That transfer function specifies a gamma number of 2.2 and
- has a linear section for small intensities). A value of zero is
- therefore black. A value of Maxval represents CIE D65 white and the
- most intense value in the image and any other image to which the image
- might be compared.
- <p>BT.709's range of channel values (16-240) is irrelevant to PGM.
- <p>Note that a common variation from the PGM format is to have the
- gray value be "linear," i.e. as specified above except
- without the gamma adjustment. <b>pnmgamma</b> takes such a PGM
- variant as input and produces a true PGM as output.
- <p>Another popular variation from PGM is to substitute the newer sRGB transfer
- function for the BT.709 one. You can use <b>pnmgamma</b> to convert between
- this variation and true PGM.
- <p>In the transparency mask variation from PGM, the value represents
- opaqueness. It is proportional to the fraction of intensity of a
- pixel that would show in place of an underlying pixel. So what
- normally means white represents total opaqueness and what normally
- means black represents total transparency. In between, you would
- compute the intensity of a composite pixel of an "under" and
- "over" pixel as under * (1-(alpha/alpha_maxval)) + over *
- (alpha/alpha_maxval). Note that there is no gamma transfer function
- in the transparency mask.
- </ol>
- <p>Strings starting with "#" may be comments, the same as
- with <a href="pbm.html">PBM</a>.
- <p>Note that you can use <b>pamdepth</b> to convert between a the
- format with 1 byte per gray value and the one with 2 bytes per gray
- value.
- <p>All characters referred to herein are encoded in ASCII.
- "newline" refers to the character known in ASCII as Line
- Feed or LF. A "white space" character is space, CR, LF,
- TAB, VT, or FF (I.e. what the ANSI standard C isspace() function
- calls white space).
- <h3 id="plainpgm">Plain PGM</h3>
- <p>There is actually another version of the PGM format that is fairly
- rare: "plain" PGM format. The format above, which generally
- considered the normal one, is known as the "raw" PGM format.
- See <b><a href="pbm.html">pbm</a></b> for some commentary on how plain
- and raw formats relate to one another and how to use them.
- <p>The difference in the plain format is:
- <ul>
- <li>
- There is exactly one image in a file.
- <li>
- The magic number is P2 instead of P5.
- <li>
- Each pixel in the raster is represented as an ASCII decimal number
- (of arbitrary size).
- <li>
- Each pixel in the raster has white space before and after it. There must
- be at least one character of white space between any two pixels, but there
- is no maximum.
- <li>
- No line should be longer than 70 characters.
- </ul>
- <p>Here is an example of a small image in the plain PGM format.
- <pre>
- P2
- # feep.pgm
- 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
- </pre>
- <p>There is a newline character at the end of each of these lines.
- <p>Programs that read this format should be as lenient as possible,
- accepting anything that looks remotely like a PGM.
- <h2 id="internetmediatype">INTERNET MEDIA TYPE</h2>
- <p>No Internet Media Type (aka MIME type, content type) for PGM has been
- registered with IANA, but the value <code>image/x-portable-graymap</code>
- is conventional.
- <p>Note that the PNM Internet Media Type <code>image/x-portable-anymap</code>
- also applies.
- <h2 id="filename">FILE NAME</h2>
- <p>There are no requirements on the name of a PGM file, but the convention is
- to use the suffix ".pgm". "pnm" is also conventional, for
- cases where distinguishing between the particular subformats of PNM is not
- convenient.
- <h2 id="compatibility">COMPATIBILITY</h2>
- <p>
- Before April 2000, a raw format PGM file could not have a maxval greater
- than 255. Hence, it could not have more than one byte per sample. Old
- programs may depend on this.
- <p>
- Before July 2000, there could be at most one image in a PGM file. As
- a result, most tools to process PGM files ignore (and don't read) any
- data after the first image.
- <h2 id="seealso">SEE ALSO</h2>
- <a href="pnm.html">pnm</a>,
- <a href="pbm.html">pbm</a>,
- <a href="ppm.html">ppm</a>,
- <a href="pam.html">pam</a>,
- <a href="libnetpbm.html">libnetpbm</a>,
- <a href="directory.html">programs that process PGM</a>,
- <h2 id="author">AUTHOR</h2>
- Copyright (C) 1989, 1991 by Jef Poskanzer.
- <hr>
- <h2 id="index">Table Of Contents</h2>
- <ul>
- <li><a href="#description">DESCRIPTION</a>
- <li><a href="#format">THE FORMAT</a>
- <ul>
- <li><a href="#plainpgm">Plain PGM</a>
- </ul>
- <li><a href="#internetmediatype">INTERNET MEDIA TYPE</a>
- <li><a href="#filename">FILE NAME</a>
- <li><a href="#compatibility">COMPATIBILITY</a>
- <li><a href="#seealso">SEE ALSO</a>
- <li><a href="#author">AUTHOR</a>
- </ul>
- </body>
- </html>
|