forced palette and quantization for RGBA images

thomas bonfort thomas.bonfort at GMAIL.COM
Sun Jan 6 04:52:16 EST 2008


hi all,

I committed the implementation to enable forced palette and color
reduction via quantization for RGBA images. These options greatly
reduce image size for png output when using IMAGEMODE RGBA.

the tracking ticket is http://trac.osgeo.org/mapserver/ticket/2436 ,
which contains examples of image size reduction you can hope to obtain
when using the option

you'll need a recent version of the mapserver source tree from SVN (
instructions to obtain it:
http://mapserver.gis.umn.edu/development/cvs/ )

it is activated when the ./configure script is run with the
--with-experimental-png switch, which checks for the libpng headers.
this means that the libpng headers have to be installed and accessible
on your system (apt-get install libpng-dev or the equivalent with
yum/yast/etc...)

to activate these outputs in your mapfiles you'll need to set some
FORMATOPTION entries to the wanted OUTPUTFORMATs, eg

************************
to force quantization
************************
(creates a paletted png, with the palette automatically
created/selected for each rendered image)

OUTPUTFORMAT
    NAME 'AGGAQ'
    DRIVER AGG/PNG # not AGG specific, also works with GD. PNG is
mandatory though
    IMAGEMODE RGBA  # only for rgba imagemodes
    MIMETYPE "image/png"

# this is the important part
    FORMATOPTION "QUANTIZE_FORCE=ON"

# this specifies the number of colors wanted in the final image
# 256 is the typically wanted value
# values 17 to 255 are possible but don't really make sense as there's
little reduction in file size compared to 256 (each pixel is still
stored with 8 bits, only the palette is smaller)
# 16 greatly reduces image size (and quality, no magic)
    FORMATOPTION "QUANTIZE_COLORS=256"
END


**********************************************
 to use a specified precomputed palette
**********************************************
(faster than quantization, and guarantees colors are consistent
whatever the image created, but less flexible as the palette has to be
precomputed and is fixed whatever is in the image)

OUTPUTFORMAT
    NAME 'AGGAP'
    DRIVER AGG/PNG
    IMAGEMODE RGBA
    MIMETYPE "image/png"

# the important part
    FORMATOPTION "PALETTE_FORCE=TRUE"
    FORMATOPTION "PALETTE=/gro/jsigmaps/palette.txt"
END

here the palette file must be specified with an absolute path, and
contains at most 256 lines, each consisting of an r,g,b,a quadruplet,
eg:

0,0,0,0
127,127,127,2
196,226,251,237
170,170,170,2
191,191,191,4
196,225,251,233
...
snip
...
163,189,242,57
137,158,242,56
118,137,241,48
184,213,245,75

to obtain this palette, take a typical (32bit rgba png) image you will
want to display, use your favorite image editor to reduce the number
of colors (photoshop using "save web image" and selecting png, or the
commandline utilities pngquant
[http://libpng.org/pub/png/apps/pngquant.html] or neuquant
[http://members.ozemail.com.au/~dekker/NEUQUANT.HTML], etc ) and then
extract (and transform to the required r,g,b,a format) the computed
palette to the palette file. ( pngcheck
[http://www.libpng.org/pub/png/apps/pngcheck.html] with its -p option
and some scripting can be used for this )



these two options are still considered experimental, and any feedback
you might give is welcome ( be it in the ./configure script,
compiling, or image results )

cheers,
thomas

ps: email sent for documentation purposes until the official
documentation is created/released on the main documentation site



More information about the mapserver-dev mailing list