dwww Home | Manual pages | Find package

PGM Format Specification(5)   File Formats Manual   PGM Format Specification(5)

NAME
       pgm - Netpbm grayscale image format

DESCRIPTION
       This program is part of Netpbm(1).

       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).

       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.

       The name "PGM" is an acronym derived from "Portable Gray Map."

       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.

THE FORMAT
       The  format  definition  is  as follows.  You can use the libnetpbm(1) C
       subroutine library to conveniently and accurately read and interpret the
       format.

       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.

       Each PGM image consists of the following:

       •      A  "magic  number"  for identifying the file type.  A pgm image's
              magic number is the two characters "P5".

       •      Whitespace (blanks, TABs, CRs, LFs).

       •      A width, formatted as ASCII characters in decimal.

       •      Whitespace.

       •      A height, again in ASCII decimal.

       •      Whitespace.

       •      The maximum gray value (Maxval), again in ASCII decimal.  Must be
              less than 65536, and more than zero.

       •      A single whitespace character (usually a newline).

       •      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.

              A row of an image is horizontal.  A column is vertical.  The pix-
              els in the image are square and contiguous.

              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.

              BT.709's range of channel values (16-240) is irrelevant to PGM.

              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.  pnmgamma takes such a PGM variant as input
              and produces a true PGM as output.

              Another  popular  variation  from  PGM is to substitute the newer
              sRGB transfer function for the BT.709 one.  You can use  pnmgamma
              to convert between this variation and true PGM.

              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  nor-
              mally 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 func-
              tion in the transparency mask.

       Strings starting with "#" may be comments, the same as with PBM(1).

       Note that you can use pamdepth to convert between the format with 1 byte
       per gray value and the one with 2 bytes per gray value.

       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).

   Plain PGM
       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 pbm(1) for some com-
       mentary on how plain and raw formats relate to one another  and  how  to
       use them.

       The difference in the plain format is:

       •      There is exactly one image in a file.

       •      The magic number is P2 instead of P5.

       •      Each  pixel in the raster is represented as an ASCII decimal num-
              ber (of arbitrary size).

       •      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.

       •      No line should be longer than 70 characters.

       Here is an example of a small image in the plain PGM format.

       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

       There is a newline character at the end of each of these lines.

       Programs that read this format should be as lenient as possible, accept-
       ing anything that looks remotely like a PGM image.

INTERNET MEDIA TYPE
       No Internet Media Type (aka MIME type, content type) for  PGM  has  been
       registered  with IANA, but the value image/x-portable-graymap is conven-
       tional.

       Note that the PNM Internet Media Type image/x-portable-anymap  also  ap-
       plies.

FILE NAME
       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.

COMPATIBILITY
       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.

       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.

SEE ALSO
       pnm(1), pbm(1), ppm(1),  pam(1),  libnetpbm(1),  programs  that  process
       PGM(1)

AUTHOR
       Copyright (C) 1989, 1991 by Jef Poskanzer.

DOCUMENT SOURCE
       This  manual  page  was generated by the Netpbm tool 'makeman' from HTML
       source.  The master documentation is at

              http://netpbm.sourceforge.net/doc/pgm.html

netpbm documentation            09 October 2016     PGM Format Specification(5)

Generated by dwww version 1.16 on Tue Dec 16 07:01:58 CET 2025.