Provided by: libnetpbm-dev_11.05.02-1.1build1_amd64 bug

NAME

       libnetpbm_ug - netpbm sample code

DESCRIPTION

       The Libnetpbm programming library is part of Netpbm(1).

Contents

       •

              Example

       •

              libnetpbm Classes

       •

              Library Initialization classes

       •

              The pam Structure

       •

              Plain versus Raw Format

       •

              Reference

Example

       Here  is  an example of a C program that uses libnetpbm to read a Netpbm image input and produce a Netpbm
       image output.

          /* Example program fragment to read a PAM or PNM image
             from stdin, add up the values of every sample in it
             (I don't know why), and write the image unchanged to
             stdout. */

          #include <netpbm/pam.h>

          struct pam inpam, outpam;
          tuple * tuplerow;
          unsigned int row;

          pm_init(argv[0], 0);

          pnm_readpaminit(stdin, &inpam, PAM_STRUCT_SIZE(tuple_type));

          outpam = inpam; outpam.file = stdout;

          pnm_writepaminit(&outpam);

          tuplerow = pnm_allocpamrow(&inpam);

          for (row = 0; row < inpam.height; ++row) {
              unsigned int column;
              pnm_readpamrow(&inpam, tuplerow);
              for (column = 0; column < inpam.width; ++column) {
                  unsigned int plane;
                  for (plane = 0; plane < inpam.depth; ++plane) {
                      grand_total += tuplerow[column][plane];
                  }
              }
              pnm_writepamrow(&outpam, tuplerow);
          }
          pnm_freepamrow(tuplerow);

libnetpbm Classes

       In this section, Guide To Using Libnetpbm, we cover only the PAM functions in libnetpbm.  As described in
       the introduction to libnetpbm" (1), there are four other classes of image processing functions (PBM, PGM,
       PPM, PNM).  They are less important, since you can do everything more easily with the PAM functions,  but
       if  you're  working  on  old  programs  or  need the extra efficiency those older functions can sometimes
       provide, you can find them documented as here:  PBM  Function  Manual(1),  PGM  Function  Manual(1),  PPM
       Function Manual(1), and PNM Function Manual(1).

       In case you're wondering, what makes the PAM functions easier to use is:

       •      Each  function handles all the formats.  It does so without converting to a common format, so your
              program can treat the different formats differently if it wants.  However, the interface makes  it
              easy for your program to ignore the differences between the formats if that's what you want.

       •      The PAM function parameter lists convey most information about the image with which you're working
              with  a  single  pam  structure, which you can build once and use over and over, whereas the older
              functions require you to pass up to 5  pieces  of  image  information  (height,  width,  etc.)  as
              separate arguments to every function.

Library Initialization

       Every  program  that  uses  the  library  must initialize the library, i.e. set up the process to use the
       library, as described in Initialization .  That is the purpose of the call to pm_init()  in  the  example
       above.

The pam Structure

       The  PAM  functions  take  most of their arguments in the form of a single pam structure.  This is not an
       opaque object, but just a convenient way to organize  the  information  upon  which  most  the  functions
       depend.   So  you are free to access or set the elements of the structure however you want.  But you will
       find in most cases it is most convenient to call  pnm_readpaminit()  or  pnm_writepaminit()  to  set  the
       members  in the pam structure before calling any other pam functions, and then just to pass the structure
       unchanged in all future calls to pam functions.

       It depends upon the function to which you pass the structure what members are inputs,  what  members  are
       outputs, and what members are irrelevant.

       It is possible for a pam structure not to specify some members, by operation of its len member.  When you
       supply  a  pam  structure  as  an  argument  to a function, the function has default behavior defined for
       unspecified members.  All the functions require that you specify at least up  through  maxval,  and  some
       require more.

       Likewise,  a  function  the returns a pam structure can return only a subset of the members defined here,
       according to its setting of the len member.  But this normally happens only because the  library  is  old
       and predates the existence of the omitted members.

       The members are:

       size   The storage size in bytes of this entire structure.

       len    The  length,  in bytes, of the information in this structure.  The information starts in the first
              byte and is contiguous.  This cannot be greater than size.  size and  len  can  be  used  to  make
              programs compatible with newer and older versions of the Netpbm libraries.

       file   The file.

       format The  format  code  of  the  image,  which tells which of the various Netpbm image formats is being
              processed.  The following macros stand for those format codes:

       PAM_FORMAT
              PAM

       RPBM_FORMAT
              raw PBM format

       RPGM_FORMAT
              raw PGM format

       RPPM_FORMAT
              raw PPM format

       PBM_FORMAT
              plain PBM format

       PGM_FORMAT
              plain PGM format

       PPM_FORMAT
              plain PPM format

              There is an important quirk in the meaning of this member when you use the pam structure to  write
              an  image:  Only the type portion of it is meaningful.  A Netpbm format code conveys two pieces of
              information: The format type (PBM, PGM, PPM, or PAM) and the plainness  (plain  PBM  vs  raw  PBM,
              etc.).   But  when  writing,  libnetpbm ignores the plainness part and instead takes the plainness
              from the plainformat member.  So PBM_FORMAT and RPBM_FORMAT are identical when writing.

              This quirk exists for historical purposes; it's necessary for consistency with the older functions
              such as pnm_writepnmrow() whose format and forceplain arguments are analogous.

              Before Netpbm 10.32 (February 2006), libnetpbm did not ignore the  plainness.   This  caused  many
              programs  to  behave  poorly,  producing  plain  format  output  when  they  should,  for backward
              compatibility at the very least, produce raw format output.

              A common way to use this member is to copy it and the plainformat member from a pam for  an  input
              image  to  a  pam  for  an  output  image.  When you do that, your output image will be raw format
              regardless of whether your input image was plain or raw, and this is the conventional behavior  of
              Netpbm programs.

       plainformat
              This  is  a  boolean  value (0 = false, 1 = true), meaningful only when writing an image file.  It
              means to write in the plain (text) version of the format indicated by format as opposed to the raw
              (binary) version.  Note that the format code in format would  appear  to  completely  specify  the
              format, making plainformat redundant.  But see the description of format for why that isn't true.

              Until  Netpbm 10.32 (February 2006), this was defined a little differently.  The format member did
              in fact completely identify the format and plainformat was redundant and  existed  as  a  separate
              member only for computational speed.  But this was inconsistent with the older libnetpbm interface
              (e.g.  pnm_writepnm(),  and  it  made  it difficult to write backward compatible programs.  Before
              Netpbm 10.32, it affected reading as well as writing.

              libnetpbm image reading functions set this member to false, for your convenience  in  building  an
              output image pam from an input image pam.

       height The height of the image in rows.

       width  The width of the image in number of columns (tuples per row).

       depth  The depth of the image (degree of or number of samples in each tuple).

       maxval The maxval of the image.  See definitions in pam(1).

       bytes_per_sample
              The number of bytes used to represent each sample in the image file.  See the format definition in
              pam(1).  This is entirely redundant with maxval.  It exists as a separate member for computational
              speed.

       tuple_type
              The  tuple  type  of  the  image.   See definitions in pam(1).  Netpbm defines values for the most
              common types of visual images, but any value is legal.  There are macros for these values:

       PAM_PBM_TUPLETYPE
              black and white image, such as would alternatively be represented by a PBM image.

       PAM_PGM_TUPLETYPE
              grayscale image, such as would alternatively be represented by a PGM image.

       PAM_PPM_TUPLETYPE
              color image, such as would alternatively be represented by a PPM image.

       PAM_PBM_ALPHA_TUPLETYPE
              black and white with a transparency (alpha) information.

       PAM_PGM_ALPHA_TUPLETYPE
              grayscale with a transparency (alpha) information.

       PAM_PPM_ALPHA_TUPLETYPE
              color with a transparency (alpha) information.

       allocation_depth
              The number of samples for which memory is  allocated  for  any  tuple  associated  with  this  PAM
              structure.  This must be at least as great as 'depth'.  Only the first 'depth' of the samples of a
              tuple are meaningful.

              The purpose of this is to make it possible for a program to change the type of a tuple to one with
              more or fewer planes.

              0 means the allocation depth is the same as the image depth.

       comment_p
              Pointer  to  a  pointer to a NUL-terminated ASCII string of comments.  When reading an image, this
              contains the comments from the image's PAM header; when writing, the image gets these as comments,
              right after the magic number line.  The individual comments are delimited by newlines and  are  in
              the same order as in the PAM header.  The "#" at the beginning of a PAM header line that indicates
              the line is a comment is not part of the comment.

              On output, NULL means no comments.

              On input, libnetpbm mallocs storage for the comments and placed the pointer at *comment_p.  Caller
              must free it.  NULL means libnetpbm does not return comments and does not allocate any storage.

              Examples:

                  const char * comments;
                  ...
                  pam.comment_p = &comments;
                  pnm_readpaminit(fileP, &pam, PAM_STRUCT_SIZE(comment_p));
                  printf("The comments are:\n");
                  printf("%s", comments)
                  free(comments);

                  const char * comments;
                  ...
                  comments = strdup("This is a comment 1\nThis is comment 2\n");
                  pam.comment_p = &comments;
                  pnm_writepaminit(&pam);
                  free(comments);

              This  works  only for PAM images.  If you read a PNM image, you always get back a null string.  If
              you write a PNM image, you always get an image that contains no comments.

              This member does not exist before Netpbm 10.35 (August 2006).  Before that, there is no  way  with
              libnetpbm  to  get  or  set  comments.  The macro PAM_HAVE_COMMENT_P is defined in pam.h where the
              member exists.

Plain Versus Raw Format

       The PNM formats each come in two varieties: the older plain (text) format  and  the  newer  raw  (binary)
       format.  There are different format codes for the plain and raw formats, but which of the two formats the
       pnm and pam functions write is independent of the format code you pass to them.

       The  pam  functions  always  write raw formats.  If you specify the format code for a plain format, a pam
       function assumes instead the raw version of that format.

       The pnm functions choose between plain and raw based on the forceplain parameter  that  every  write-type
       pnm  function  has.   If  this boolean value is true, the function writes the plain version of the format
       specified by the format code.  If it is false,  the  function  writes  the  raw  version  of  the  format
       specified by the format code.

       We  are  trying to stamp out the older plain formats, so it would be a wise choice not to write a program
       that sets forceplain true under any  circumstance.   A  user  who  needs  a  plain  format  can  use  the
       pnmtoplainpnm program to convert the output of your program to plain format.

Reference

       The  Libnetpbm  Netpbm  Image Processing Manual" (1) describes the the libnetpbm functions for processing
       image data.

       The Libnetpbm Utility Manual(1) describes the functions that are not specifically related to  the  Netpbm
       image formats.

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/libnetpbm_ug.html

netpbm documentation                                                        Libnetpbm Image Processing Manual(3)