The Libnetpbm programming library is part of Netpbm.
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 <pam.h> struct pam inpam, outpam; unsigned int row; pnm_init(&argc, argv); 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);
In this section, we cover only the PAM functions in libnetpbm. As described in the introduction to libnetpbm, 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, PGM Function Manual,PPM Function Manual, and PNM Function Manual.
In case you're wondering, what makes the PAM functions easier to use is:
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 fields 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.
The fields are:
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.
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.
The Libnetpbm Netpbm Image Processing Manual describes the the libnetpbm functions for processing image data.
The Libnetpbm Utility Manual describes the functions that are not specifically related to the Netpbm image formats.