NAME
pngcrush — optimizes (or modifies) PNG (Portable Network Graphics)
files.
SYNOPSIS
pngcrush [options] [infile.png] [outfile.png]
pngcrush -e ext [options] [file1.png] [file2.png] ...
pngcrush -d dir [options] [file1.png] [file2.png] ...
DESCRIPTION
pngcrush is an optimizer for PNG (Portable Network Graphics) files.
Its main purpose is to reduce the size of the file’s IDAT chunk (or
stream). pngcrush can also be used to modify a PNG’s ancillary chunks
(example: transparency information or textual comments). Some
familiarity with the PNG (pronounced ’ping’) format may be helpful to
users of pngcrush. pngcrush has reasonable defaults so running with no
options may produce smaller files. This document briefly describes the
PNG format where necessary to understand pngcrush. For complete
documentation, see :
http://www.libpng.org/pub/png/.
The actual pixel data of a PNG is contained in one or many IDAT chunks.
To make an IDAT chunk PNG encoders take the raw pixel data, filter it
with one of 5 different filters (See Section "Filter Types" ) then
compress it. pngcrush reduces the size of PNG files by choosing a
different filter or compression methods from those used in the input
file. pngcrush tries multiple filter/compression methods and compares
the size of the resulting IDAT chunk. The filter/compression method
with the smallest IDAT chunk is chosen for the output file. The filter
and compression levels pngcrush tries are controlled by command line
options. All of the filter methods and compression levels are
lossless; they will not reduce image quality.
In addition to reducing the size of a PNG file, pngcrush can modify
ancillary chunks. Ancillary chunks are optional information including
transparency (tRNS), gamma (gAMMA), standard RGB color space
conformance (sRGB) or textual information (iTXt, tEXt or zTXt). See
the associated command line options for details on manipulating these
chunks.
OPTIONS
-already size
If file has an IDAT chunk greater than the integer size, it
will be considered to be already crushed and will not be
processed further.
-bit_depth n
Force output bit depth to n. See Section "Color Types" for
bit depth restrictions.
-bkgd r g b
Specify the default background color for the image. Some PNG
viewers will use this background when displaying the image.
Background is specified by r, g and b integers between 0 and
(2^bitdepth)-1. For output color type 0 and 4 (gray, see
section "Color Types" ) the green index is used as the gray
level of the background.
-brute Use brute force, try 114 different filter/compression methods
[11-124]. This option is very time-consuming and generally
not worthwhile. You can restrict this option to certain
filter types, compression levels, or strategies by following
it with -f filter, -l level, or -z strategy. For example:
pngcrush -brute -f 0 infile.png
Will try only methods that use filter type 0.
-c type Set the output image color type to type, one of [0, 2, 4, or
6] (see section "Color Types" ). Future versions of pngcrush
will also allow color type 3, if there are 256 or fewer
colors present in the input file. Color types 4 and 6 are
padded with an opaque alpha channel if the input file does
not have alpha information. You can use 0 or 4 to convert
color to grayscale. Use 0 or 2 to delete an unwanted alpha
channel. Default is to use same color type as the input file.
-d dir Specify a directory for all output files. All output files
will have the same name as their respective input files.
-dou Double the images gamma. This is used for fixing gamma in
PhotoShop 5.0c5.02 files. It has been claimed that the PS5
bug is actually more complex than that, in some unspecified
way.
-e ext Specify a new extension ext for all output files.
-exit Forces pngcrush to call exit() rather than return() when it
is finished. It is unclear to this writer why this option
exists.
-f filter Specify filter (see section "Filter Types" ) to use with the
method specified in the preceding -m or -brute option. Valid
filter types are [0-4] : use specified filter, [5]: use
adaptive filtering.
-fix Fix otherwise fatal conditions such as bad CRCs. The CRC
(Cyclic Redundancy Check) is present in every chunk and can
alert the decoder of corrupt data.
-force Write a new output file even if larger than input. Otherwise
the input file will be copied to output if it is smaller than
any generated file and no chunk additions, removals, or
changes were requested.
-g gamma Value to insert in gAMA chunk, only if the input file has no
gAMA chunk. To replace an existing gAMA chunk, use the
-replace_gamma option. Some decoders will use the gAMA chunk
to more accurately display the image. gamma relates the
output intensity to the input samples (input_sample =
light_out GAMMA). gamma can be any integer between 0 and 2
32 and is interpreted as GAMMA*100000. For example, if you
wanted a GAMMA of 1/2.2, you would enter 45455 for gamma.
-h Display help and legal notices.
-itxt b|a keyword text
Insert an (uncompressed) iTXt chunk. b|a indicates whether
chunk should be inserted before or after the IDAT chunk, (see
Section "Text Chunks" ).
-keep chunk_name
keep named chunk chunk_name even if the PNG datastream
becomes invalid. Currently only dSIG is recognized as an
acceptable value.
-l level zlib compression level to use on the filtered IDAT chunk with
the method specified by the preceding -m or -brute option.
zlib compression levels are integers between 0 and 9. 0 = no
compression, 1 = fastest compression, and 9 = best
compression.
-loco Make the file more compressible by performing a lossless,
reversible, color transformation. The resulting file is a MNG
format file, not a PNG, and should be given the .mng file
extension. The loco option has no effect on grayscale or
indexed-color PNG files.
-m method pngcrush method [0-200] to try (0 means try all of 1-10). Can
be repeated as in -m 1 -m 4 -m 7. This can be useful if you
run out of memory when pngcrush tries methods 2, 3, 5, 6, 8,
9, or 10 which use filtering and are memory intensive.
Method 1, 4, and 7 use no filtering; methods 11 and up use
specified filter, compression level, and strategy.
-max maximum_IDAT_size
Set the maximum idat size to be used when creating the
compression buffer.[1 through 524288]
-mng write a new MNG, do not crush embedded PNGs.
-n Do not do compression or write output file. This is useful in
conjunction with the -v option to get info, or to test decode
speed.
-p This option tells pngcrush to pause and wait for [enter] key
whenever the screen fills.
-plte_len n
Truncates the PLTE. The PLTE chunk contains from 1 to 256
palette entries. Be sure not to truncate it to less than the
greatest index present in IDAT.
-q quiet, the opposite of verbose.
-rem chunkname
Name of an ancillary chunk or optional PLTE to be removed. Be
careful with this. Please don’t use this feature to remove
transparency, gamma, copyright, or other valuable
information. To remove several different chunks, repeat:
-rem tEXt -rem pHYs. Known chunks (those in the PNG spec or
extensions document) can be named with all lower-case
letters, so -rem bkgd is equivalent to -rem bKGD. But note:
-rem text removes all forms of text chunks; Exact case is
required to remove unknown chunks. To do surgery with a
chain-saw, -rem alla removes all known ancillary chunks
except for tRNS, and -rem allb removes all but tRNS and gAMA.
-replace_gamma gamma
Force a specified gamma in the output file even if gAMA is
present in the input. See the -g for more information.
-res dpi Write a pHYs chunk with a resolution of dpi. The pHYs chunk
indicates the desired pixel size.
-save Force writing of unknown chunks. If the input image has
chunks that are not part of the PNG specification, they
should not be discarded.
-srgb n Set value of rendering intent for sRGB chunk to n where n is
between 0 and 3. The appropriate rendering intent depends on
how the image will be used:
0 - Perceptual: when good adaptation to the output
device gamut at the expense of colorimetric
accuracy is desired, example: photographs.
1 - Relative colorimetric: images requiring color
appearance matching (relative to the output device
white point), example: logos.
2: Saturation: preservation of saturation at the
expense of hue and lightness is preferred, example:
charts and graphs.
3: Absolute colorimetric: images requiring
preservation of absolute colorimetry, example:
proofs (previews of images destined for a different
output device).
-text [b|a] keyword text
Insert a tEXt chunk. [b|a] indicates whether chunk should be
inserted before or after the IDAT chunk, (see Section "Text
Chunks" ).
-newtimestamp
Reset file modification time to newer time stamp. This is the
default.
-oldtimestamp
Retain input file modification time stamp. The default is
-newtimestamp which is the opposite of this option.
-trns index red green blue gray
Insert a tRNS (transparency) chunk, if no tRNS chunk found in
file. You must give all five parameters regardless of the
color type, scaled to the output bit depth. See the PNG
documentation for details.
-trns_array n trns[0] trns[1] ... trns[n-1]
Insert a tRNS (transparency) chunk, if no tRNS chunk found in
file. See the PNG documentation for details.
-v Display more detailed information. Repeat the option (use "-v
-v") for even more.
-w size Specify size in kbytes (or bytes in the case of 512) of the
sliding compression window where size is one of [32, 16, 8,
4, 2, 1, or 512]. It’s best to use the default (32) unless
you run out of memory. The program will use a smaller window
anyway when the uncompressed file is smaller than 16k.
-z strategy
Specify the zlib compression strategy [0, 1, or 2] to be used
on the filtered IDAT chunk for the method of the preceding
-m. The zlib strategy parameter tunes the compression
algorithm and is one of:
· 0 : default, most compression is aimed towards string
matching
· 1 : some string matching, some Huffman coding
· 2 : use only Huffman coding
-zitxt [b|a] keyword text
Insert a zTXt chunk. [b|a] indicates whether chunk should be
inserted before or after the IDAT chunk, (see Section "Text
Chunks" ).
-ztxt [b|a] keyword text
zTXt chunk to insert (see -text).
Color Types
The PNG specification provides for five color types. The color type
determines how the IDAT chunk will be interpreted by the decoder.
Choosing a color type appropriate for the color information in an image
can in principle reduce the size. However, certain combinations of -c
and -bit_depth require color counting which is currently disabled. In
such cases no reduction will take place. Following are the PNG color
types followed by their supported bit depths (Note pngcrush does not
support changing a file to color type 3 from another color type.):
· 0 : grayscale without alpha channel (1,2,4,8,16)
· 2 : true color without alpha channel (8,16)
· 3 : indexed color (1,2,4,8)
· 4 : grayscale with alpha channel (8,16)
· 6 : true color with alpha channel (8,16)
An alpha channel represents transparency on a per pixel basis. An alpha
value of zero is completely transparent. An alpha channel of 2
bitdepth-1 is completely opaque.
Filter Types
The IDAT chunk can optionally be filtered before compression. These
filters can make the IDAT chunk more compressible without losing any
data and result in a smaller PNG file. These filters are applied to
the bytes of the IDAT chunk, not the pixels. Following is a brief
description of the filters, see the PNG specification for details:
· 0 : no filter
· 1 : ’sub’ transmits the difference between each byte and the
value of the corresponding byte of the prior pixel.
· 2 : ’up’ transmits the difference between each byte and the value
of the corresponding byte of the pixel above this pixel
· 3 : ’average’ transmits the difference between each byte and the
average of the bytes described in filters 1 and 2
· 4 : ’paeth’ computes a simple linear function of the
corresponding byte in three neighboring pixels (paeth_predictor =
left + above - upper left), then transmits the difference between
the byte in question and the neighboring byte closest to the
value of paeth_predictor.
Text Chunks
Textual information pertaining to an image can be conveyed with the
tEXt, iTXt and zTXt chunks. All text chunks consist of a keyword
followed by a string. The following keywords are defined in the PNG
specification: (you may invent keywords for other purposes):
Title: Short title or caption for image
Author: Name of image’s creator
Description: Longer description of image
Copyright: Copyright notice
Creation Time: Time of original image creation
Software: Software used to create the image
Disclaimer: Legal disclaimer
Warning: Warning of nature of content
Source: Device used to create the image
Comment: Miscellaneous comment.
A tEXt chunk stores text in the ISO/IEC 8859-1 (Latin-1) character set.
zTXt chunks also use the Latin-1 character set, but the text is
compressed. This can be useful for large text chunks. iTXt chunks
consist of text in the UTF-8 of the Unicode character set.
keyword must be at least 1 character and less than 80 characters. text
must be less than 2048 characters when using pngcrush For now, you
can only add ten tEXt, iTXt, or zTXt chunks per pngcrush run.
SEE ALSO
png(5), libpng(3), zlib(3).
AUTHOR
This manual page was written by David Whedon dwhedon@gordian.com for
the Debian GNU/Linux system (but may be used by others). Much of the
information was gleaned from "PNG (Portable Network Graphics)
Specification, Version 1.2"
pngcrush(1)