diff options
author | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2006-08-19 03:12:28 +0000 |
---|---|---|
committer | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2006-08-19 03:12:28 +0000 |
commit | 1fd361a1ea06e44286c213ca1f814f49306fdc43 (patch) | |
tree | 64c8c96cf54d8718847339a403e5e67b922e8c3f /editor/ppmquantall | |
download | netpbm-mirror-1fd361a1ea06e44286c213ca1f814f49306fdc43.tar.gz netpbm-mirror-1fd361a1ea06e44286c213ca1f814f49306fdc43.tar.xz netpbm-mirror-1fd361a1ea06e44286c213ca1f814f49306fdc43.zip |
Create Subversion repository
git-svn-id: http://svn.code.sf.net/p/netpbm/code/trunk@1 9d0c8265-081b-0410-96cb-a4ca84ce46f8
Diffstat (limited to 'editor/ppmquantall')
-rwxr-xr-x | editor/ppmquantall | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/editor/ppmquantall b/editor/ppmquantall new file mode 100755 index 00000000..af1ce22c --- /dev/null +++ b/editor/ppmquantall @@ -0,0 +1,97 @@ +#!/bin/sh +# +# ppmquantall - run ppmquant on a bunch of files all at once, so they share +# a common colormap +# +# WARNING: overwrites the source files with the results!!! +# +# Verbose explanation: Let's say you've got a dozen pixmaps that you want +# to display on the screen all at the same time. Your screen can only +# display 256 different colors, but the pixmaps have a total of a thousand +# or so different colors. For a single pixmap you solve this problem with +# pnmquant; this script solves it for multiple pixmaps. All it does is +# concatenate them together into one big pixmap, run pnmquant on that, and +# then split it up into little pixmaps again. +# +# IMPLEMENTATION NOTE: Now that Pnmcolormap can compute a single colormap +# for a whole stream of images, this program could be implemented more +# simply. Today, it concatenates a bunch of images into one image, uses +# Pnmquant to quantize that, then splits the result back into multiple +# images. It could instead just run Pnmcolormap over all the images, +# then run Pnmremap on each input image using the one colormap for all. + +usage() +{ + echo "usage: $0 [-ext extension] <newcolors> <ppmfile> ..." + exit 1 +} + +ext= + +while :; do + + case "$1" in + -ext*) + if [ $# -lt 2 ]; then + usage + fi + ext=".$2" + shift + shift + ;; + + *) + break + ;; + + esac +done + +if [ $# -lt 2 ]; then + usage +fi + +newcolors=$1 +shift +nfiles=$# +files=($@) + +# Extract the width and height of each of the images. +# Here, we make the assumption that the width and height are on the +# second line, even though the PPM format doesn't require that. +# To be robust, we need to use Pnmfile to get that information, or +# Put this program in C and use ppm_readppminit(). + +set widths=() +set heights=() + +for i in ${files[@]}; do + widths=(${widths[*]} `grep -v '^#' $i | sed '1d; s/ .*//; 2q'`) + heights=(${heights[*]} `grep -v '^#' $i | sed '1d; s/.* //; 2q'`) +done + +tempdir="${TMPDIR-/tmp}/ppmquantall.$$" +mkdir $tempdir || { echo "Could not create temporary file. Exiting."; exit 1;} +chmod 700 $tempdir + +trap 'rm -rf $tempdir' 0 1 3 15 + +all=$tempdir/pqa.all.$$ + +pnmcat -topbottom -jleft -white ${files[@]} | pnmquant $newcolors > $all +if [ $? != 0 ]; then + exit $? +fi + +y=0 +i=0 + +while [ $i -lt $nfiles ]; do + pamcut -left 0 -top $y -width ${widths[$i]} -height ${heights[$i]} $all \ + > ${files[$i]}$ext + if [ $? != 0 ]; then + exit $? + fi + y=$(($y + ${heights[$i]})) + i=$(($i + 1)) +done |