Home / Alt manpages / pamtable(1)

  • pamtable(1)
  • User command
  • linux

Read Netpbm Pixels as a Table with pamtable

Staring at a raw Netpbm file in a hex editor is no way to check a pixel value, and pamtable turns that raster into a plain table of numbers instead. You choose decimal, tuple or hexadecimal output, and can feed an image through standard input when that suits the pipeline better. The examples use Netpbm 11.5.2 from the Debian netpbm package. Allow about ten minutes if you already have a small PPM, PGM or PAM file ready.

This is a read-only workflow. pamtable does not alter the input image, and none of the commands below needs sudo. You need a shell, the netpbm package and a readable Netpbm image.

1. Check the installed command

Confirm which executable will run, then record the library version reported by the program:

$ command -v pamtable
/usr/bin/pamtable
$ pamtable --version
pamtable: Using libnetpbm from Netpbm Version: Netpbm 11.5.2
...

The version text carries build details that vary by distribution; the part worth noting is the Netpbm version itself. This guide describes the command as installed here, and the manual page dates -tuple and -hex back to features added in Netpbm 10.11.00.

2. Print the image in the default format

Pass one input filename. Replace the placeholder with an existing Netpbm image:

$ pamtable /path/to/image.ppm

For a three-pixel-wide, two-row RGB image with maximum sample value 255, the output has one line per image row and vertical bars between RGB tuples:

  0   0   0|255   0   0|  0 255   0
255 255 255|128  64  32|  1   2   3

Samples inside one tuple are separated by spaces. Values print as decimal numbers, right-justified to the width the image's maximum value needs. A bar marks the boundary between pixels in a multi-sample image; a one-sample image, such as a greyscale raster, uses spaces between adjacent samples instead.

Checkpoint

The number of output lines should match the image height. If the rows look unexpectedly long, run pamfile to check the image dimensions and tuple type before touching the input.

3. Use tuple notation for RGB-style data

Add -tuple when each pixel should read as a visually grouped mathematical tuple:

$ pamtable -tuple /path/to/image.ppm
(0,0,0) (255,0,0) (0,255,0)
(255,255,255) (128,64,32) (1,2,3)

This drops the vertical-bar separators and wraps each tuple in parentheses, which is handy for pasting a small raster into notes or comparing whole pixel values side by side. It does not resize, colour-convert or otherwise interpret the samples: the values still come straight from the Netpbm image.

4. Use hexadecimal values

Use -hex when hex is easier to line up against byte-oriented data:

$ pamtable -hex /path/to/image.ppm
00 00 00|ff 00 00|00 ff 00
ff ff ff|80 40 20|01 02 03

The local command prints lower-case hexadecimal sample values and keeps the same tuple separators as the normal layout. Do not combine -hex with -tuple: the manual marks that pairing as invalid, so pick one representation per run.

Hex here is only a display choice, not a conversion of the source file. A sample value of 1 still shows as 01 for an image whose maximum value is 255. If the image uses a different maximum, read the numbers against that image's own metadata rather than assuming eight-bit channels.

5. Read from standard input

The filename is optional. With none given, pamtable reads the Netpbm image from standard input, so it can sit at the end of a pipeline:

$ cat /path/to/image.ppm | pamtable -tuple
(0,0,0) (255,0,0) (0,255,0)
(255,255,255) (128,64,32) (1,2,3)

For a file on disk, skip the extra process and use the direct form instead:

$ pamtable < /path/to/image.ppm

Keep the output on the terminal or redirect it to a new text file. Do not redirect it over the source image: although the command only reads its input, shell redirection can truncate a destination before pamtable even starts. Use a distinct name for a saved table:

$ pamtable /path/to/image.ppm > image-samples.txt
$ sed -n '1,5p' image-samples.txt

Recovery

If you accidentally chose an existing destination, stop and check it before running anything else. Whether it is recoverable depends entirely on backups or version control; pamtable has no undo for a shell redirection.

6. Narrow the data before printing

pamtable always prints the complete raster, and for a large image that means an unwieldy wall of text with lines too long to read comfortably. Filter the image first when you only need a region or selected channels:

$ pamcut -left 0 -right 9 -top 0 -bottom 9 /path/to/image.ppm | pamtable
$ pamchannel 0 /path/to/image.ppm | pamtable

These examples lean on other Netpbm commands and their own options, so check their manual pages against your installed release. The boundary worth remembering: pamtable only displays the samples it receives, it never selects rows, columns or planes itself.

For a very wide table, pipe the result to less --chop-long-lines. If you need it denser still, the manual suggests reducing the image maximum value with pamdepth first, but that changes the image data, so keep the original and write any transformed image to a new file.

Common traps

  • "Cannot open" or a missing-file error. Check the path and permissions with ls -l /path/to/image.ppm. Do not reach for sudo until you actually know the file needs elevated access.
  • Output has the wrong shape. Inspect the input with pamfile /path/to/image.ppm. The program prints the raster's real rows and tuples, it never infers dimensions from a filename.
  • Hex and tuple modes were mixed. Run one command with either -hex or -tuple, never both.
  • The table is hard to read. Use a smaller region, a pager, or a separate output file. Avoid opening a large generated table in a graphical editor that might alter line endings or whitespace.

When a command fails, the input image is normally untouched because pamtable only reads it. Check the exit status right after the command with printf '%s\n' "$?"; a zero status means the command finished, not that you have visually confirmed every value.

Done means

  • command -v pamtable points to the Netpbm installation you meant to use.
  • The output has one line per input row and the sample grouping you expected.
  • You chose deliberately between decimal, -tuple or -hex, without combining the latter two.
  • Any redirected table used a new destination, leaving the source image intact.