Pngcrush is an optimizer for PNG (Portable Network Graphics) files. It can be run from a commandline in an MSDOS window, or from a UNIX or LINUX commandline.

Its main purpose is to reduce the size of the PNG IDAT datastream by trying various compression levels and PNG filter methods. It also can be used to remove unwanted ancillary chunks, or to add certain chunks including gAMA, tRNS, iCCP, and textual chunks.

Pngcrush, when statically linked to the supplied zlib code, is believed to be immune to the zlib-1.1.3 "double-free" bug, since by default it detects and rejects any "double-free" attempt. It merely generates a "Decompression Error" message and rejects the file.

Pngcrush is open source and may be used, modified, and redistributed by anyone without paying a fee. The license, embedded in the file pngcrush.c, is equivalent but not identical to the libpng license found in the libpng file png.h.

The source code for pngcrush is here. and the binary executables, built by third party volunteers and not always up to date, are here. Pngcrush uses libpng and zlib, both of which are included in this pngcrush source distribution. They are slightly modified:

  • libpng's pngconf.h is modified to "#include pngcrush.h" which is used
    • to "#define out" unused parts of the library
    • #define PNG_ABORT()
    • to set the IDAT buffer size to a large value, and
  • zlib is modified to set the TOO_FAR macro to 32767 in deflate.c

If you prefer, you can compile only pngcrush.c from the pngcrush source distribution and run it with the stock libpng and zlib, which can be found at the PNG web site, If you do this,

  • The iTXt chunk will not be supported if your version of libpng does not support it. Libpng will start supporting the iTXt chunk by default with version 1.4.0.

  • pngcrush will be vulnerable to various overflow conditions that were fixed in August 2004, if you use an unpatched libpng version earlier than version 1.2.7/1.0.17.

  • pngcrush will be vulnerable to the zlib-1.1.3 double-free bug, if you link pngcrush with zlib-1.1.3 and a version of libpng such as any 1.0.x that does not have PNG_USER_MEM_SUPPORTED enabled.

  • TOO_FAR will be 4096 instead of 32767 in deflate.c,

    which will result in slightly larger files and slightly faster execution.

  • also, you will be unable to read erroneous PNG files with "Too many IDAT's".

Precompiled binaries for Windows (runs in MSDOS window, built under DJGPP) and RISCOS platforms (all perhaps out-of-date) are here

A fork of pngcrush development exists, by Cosmin Truta, with a slightly different feature set and search space. See"

Pngcrush is a commandline application. If you prefer a draggity-droppity GUI, several are available, including these which embed pngcrush along with other commandline image compressors/optimizers:

  • ImageOptim for Macs, free, GPLv2 license
  • Trimage for Linux, Windows, Mac, free, MIT license

Apple distributes a modified version of pngcrush. It claims to be the real pngcrush and does not inform the user of the changes as the pngcrush license requires. It creates files that are not valid PNG datastreams, since they begin with the CgBI chunk instead of the IHDR chunk.

The Apple-modified pngcrush is capable of reverting the "iPhone optimizations" (except for unavoidable loss of precision in the underlying color values of non-opaque pixels). There are also third-party applications such as the public domain, open source pngdefry application that can be found on the net. I am required to note that Apple and iPhone are registered trademarks of Apple, Inc.

Links to translations of this page, or older versions of it, are available.

The author of pngcrush is Glenn Randers-Pehrson,