PNMMONTAGE(1)

πŸ’– PNMMONTAGE πŸ’–

okay bestie, welcome to the Pnmmontage User Manual (that's section 1 of the manual, general commands) ✨ this one's a classic Netpbm baddie and she's about to pack your pics like a pro πŸŽ€


🌸 NAME 🌸

pnmmontage β€” create a montage of PNM images

like, a collage. but make it compute. πŸ¦‹


✨ SYNOPSIS ✨

pnmmontage

[-header=headerfile]

[-quality=n]

[-prefix=prefix]

[-0|-1|-2|...|-9]

[-data=filename]

pnmfile...

πŸ’… DESCRIPTION πŸ’…

okay so first things first: this program is part of Netpbm(1). she's in the family, she knows people. πŸ‘‘

pnmmontage packs images of differing sizes into a minimum-area composite image. that's the whole flex. different sizes, one big image, smallest possible footprint. it's giving tetris but for pixels 🧩✨

and listen β€” any areas of the output that cannot be occupied by an image are black. no filling, no stretching, no vibes, just black. πŸ–€


πŸ’œ OPTIONS πŸ’œ

so on top of the options common to all programs based on libnetpbm (most notably -quiet, see Common Options), pnmmontage recognizes these following command line options, bestie:

  • -data=filename β€” this one makes pnmmontage write a file describing, in machine-readable form, the positions of the original images inside the packed image. here's an example, look at her:
            :0:0:227:298
            ../image1.ppm:0:0:227:149
            ../image2.ppm:0:149:227:149

there is a line for each component image and one for the composite. πŸ’«

the 5 fields on each line are:

  • source image name (or null string indicating the line for the composite image)
  • Column number of upper left corner of the image
  • Row number of upper left corner of the image
  • width of the image (columns)
  • height of the image (rows)

this option was new in Netpbm 10.6 (July 2002). a lil retro moment πŸ™ˆ

  • -header=filename β€” tells pnmmontage to write a C header file of the locations of the original images within the packed image. each original image generates four #defines within the packed file: xxxX, xxxY, xxxSZX, and xxxSZY, where xxx is the name of the file, converted to all uppercase. the output also includes #defines OVERALLX and OVERALLY, which specifies the total size of the montage image. πŸ’–

here's an example:

            #define OVERALLX 227
            #define OVERALLY 298

            #define X 0
            #define Y 0
            #define SZX 227
            #define SZY 149

            #define X 0
            #define Y 149
            #define SZX 227
            #define SZY 149
  • -prefix β€” tells pnmmontage to use the specified prefix on all of the #defines it generates. tiny addition, big organizational energy πŸŽ€
  • -quality β€” okay this one's the brain of the operation. before attempting to place the subimages, pnmmontage will calculate a minimum possible area for the montage; this is either the total of the areas of all the subimages, or the width of the widest subimage times the height of the tallest subimage, whichever is greater. then pnmmontage initiates a problem-space search to find the best packing; if it finds a solution that is (at least) as good as the minimum area times the quality as a percent, it will break out of the search. so -quality=100 will find the best possible solution; however, it may take a very long time to do so 😭 the default is -quality=200.
  • -0, -1, ... -9 β€” these options control the quality at a higher level than -quality; -0 is the worst quality (pick the first solution found), while -9 is the best quality (perform an exhaustive search of problem space for the absolute best packing). the higher the number, the slower the computation. the default is -5. ⭐
not me reminding you that higher number = slower. she's thorough, not fast. πŸ’€

🌈 NOTES 🌈

Using -9 is very slow on all but the smallest image sets. like, go make a snack, bestie. πŸ“

The minimum area arrangement is often not a convenient shape. for example, it might be a tall, thin column of images, when you'd rather have something more square. to force a minimum width or height, you can include a strut image β€” a black image that wide and one pixel high. similarly, you can use a vertical strut to force a minimum height. 🧚 it's giving scaffolding, and honestly? iconic.


🫢 SEE ALSO 🫢

pamcat(1), pnmindex(1), pnm(1), pam(1), pbm(1), pgm(1), ppm(1)

(the whole friend group πŸ’•)


πŸ‘‘ HISTORY πŸ‘‘

pnmmontage was new in Netpbm 9.10 (January 2001). a true elder of the squad ✨


πŸ’œ AUTHOR πŸ’œ

Copyright (C) 2000 by Ben Olmstead.


πŸŽ€ 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/pnmmontage.html

and that's the whole page, bestie πŸ¦‹ this was the Pnmmontage User Manual(1), part of the netpbm documentation, dated 22 November 2012. no cap, go pack some pixels πŸ’…βœ¨πŸŒΈ

πŸ“¦ where this page comes from