pngquant

pngquant is a command-line utility and a library for lossy compression of PNG images.

The conversion reduces file sizes significantly (often as much as 70%) and preserves full alpha transparency. Generated images are compatible with all modern web browsers, and have better fallback in IE6 than 24-bit PNGs.

Features

originalconverted
Original PNG: 75,628 bytespngquant: 19,996 bytes (73% smaller)

Download

Current version is 2.3.0 (changelog, feed, all releases).

GUI

Command-line

NB: don't use version 1.0 of pngquant. There is a massive difference in quality and compression between recent versions and the obsolete version that can still is shipped in some Linux distributions. Use pngquant -v to check.

Preview.app and QuickLook in Mac OS X 10.9.1 (Mavericks) had a bug that caused PNG images to be displayed with wrong brightness. It's been fixed in OS X 10.9.2.

Source code

Written in C99. Available under a BSD license. The project is hosted on GitHub.

git clone git://github.com/pornel/pngquant.git

Authors

pngquant is developed by Kornel Lesiński and contributors. It's based on code by Greg Roelofs and Jef Poskanzer.

Please submit bug reports or feature requests on GitHub.

Manual

To further reduce file size use optipng or ImageOptim.

Options

See pngquant -h for full list of options.

--ext new.png

Set custom extension for output filename. By default -or8.png or -fs8.png is used.

--quality min-max

Instructs pngquant to use the least amount of colors required to meet or exceed the max quality. If conversion results in quality below the min quality the image won't be saved (if outputting to stdout, 24-bit original will be output) and pngquant will exit with status code 99.

min and max are numbers in range 0 (worst) to 100 (perfect), similar to JPEG.

pngquant --quality=65-80 image.png
--speed N, -sN

Speed/quality trade-off from 1 (brute-force) to 10 (fastest). The default is 3. Speed 10 has 5% lower quality, but is 8 times faster than the default.

--iebug

Workaround for IE6, which only displays fully opaque pixels. pngquant will make almost-opaque pixels fully opaque and will avoid creating new transparent colors.

--version

Print version information to stdout.

-

Read image from stdin and send result to stdout.

--

Stops processing of arguments. This allows use of file names that start with -. If you're using pngquant in a script, it's advisable to put this before file names:

pngquant $OPTIONS -- "$FILE"

Algorithm

pngquant uses modified version of Median Cut quantization algorithm and additional techniques to mitigate deficiencies of Median Cut.

Instead of splitting boxes with largest volume or number of colors, boxes are selected to minimize variance from their median value.

Histogram is built with addition of a basic perception model, which gives less weight to noisy areas of the image.

To improve color further, histogram is adjusted in a process similar to gradient descent (Median Cut is repeated many times with more weight on poorly represented colors).

Finally, colors are corrected using Voronoi iteration (K-means), which guarantees locally optimal palette.

pngquant works in premultiplied alpha color space to give less weight to transparent colors.

When remapping, error diffusion is applied only to areas where several neighboring pixels quantize to the same value, and which are not edges. This avoids adding noise to areas which have high visual quality without dithering.

See also