png
png ¶
Pure Python PNG Reader/Writer
This Python module implements support for PNG images (see PNG
specification at http://www.w3.org/TR/2003/REC-PNG-20031110/ ). It reads
and writes PNG files with all allowable bit depths
(1/2/4/8/16/24/32/48/64 bits per pixel) and colour combinations:
greyscale (1/2/4/8/16 bit); RGB, RGBA, LA (greyscale with alpha) with
8/16 bits per channel; colour mapped images (1/2/4/8 bit).
Adam7 interlacing is supported for reading and
writing. A number of optional chunks can be specified (when writing)
and understood (when reading): tRNS, bKGD, gAMA.
For help, type import png; help(png) in your python interpreter.
A good place to start is the :class:Reader and :class:Writer
classes.
Requires Python 2.3. Limited support is available for Python 2.2, but
not everything works. Best with Python 2.4 and higher. Installation is
trivial, but see the README.txt file (with the source distribution)
for details.
This file can also be used as a command-line utility to convert
Netpbm <http://netpbm.sourceforge.net/>_ PNM files to PNG, and the
reverse conversion from PNG to PNM. The interface is similar to that
of the pnmtopng program from Netpbm. Type python png.py --help
at the shell prompt for usage and a list of options.
A note on spelling and terminology¶
Generally British English spelling is used in the documentation. So that's "greyscale" and "colour". This not only matches the author's native language, it's also used by the PNG specification.
The major colour models supported by PNG (and hence by PyPNG) are: greyscale, RGB, greyscale--alpha, RGB--alpha. These are sometimes referred to using the abbreviations: L, RGB, LA, RGBA. In this case each letter abbreviates a single channel: L is for Luminance or Luma or Lightness which is the channel used in greyscale images; R, G, B stand for Red, Green, Blue, the components of a colour image; A stands for Alpha, the opacity channel (used for transparency effects, but higher values are more opaque, so it makes sense to call it opacity).
A note on formats¶
When getting pixel data out of this module (reading) and presenting data to this module (writing) there are a number of ways the data could be represented as a Python value. Generally this module uses one of three formats called "flat row flat pixel", "boxed row flat pixel", and "boxed row boxed pixel". Basically the concern is whether each pixel and each row comes in its own little tuple (box), or not.
Consider an image that is 3 pixels wide by 2 pixels high, and each pixel has RGB components:
Boxed row flat pixel::
list([R,G,B, R,G,B, R,G,B], [R,G,B, R,G,B, R,G,B])
Each row appears as its own list, but the pixels are flattened so that three values for one pixel simply follow the three values for the previous pixel. This is the most common format used, because it provides a good compromise between space and convenience. PyPNG regards itself as at liberty to replace any sequence type with any sufficiently compatible other sequence type; in practice each row is an array (from the array module), and the outer list is sometimes an iterator rather than an explicit list (so that streaming is possible).
Flat row flat pixel::
[R,G,B, R,G,B, R,G,B, R,G,B, R,G,B, R,G,B]
The entire image is one single giant sequence of colour values. Generally an array will be used (to save space), not a list.
Boxed row boxed pixel::
list([ (R,G,B), (R,G,B), (R,G,B) ], [ (R,G,B), (R,G,B), (R,G,B) ])
Each row appears in its own list, but each pixel also appears in its own tuple. A serious memory burn in Python.
In all cases the top row comes first, and for each row the pixels are ordered from left-to-right. Within a pixel the values appear in the order, R-G-B-A (or L-A for greyscale--alpha).
There is a fourth format, mentioned because it is used internally,
is close to what lies inside a PNG file itself, and has some support
from the public API. This format is called packed. When packed,
each row is a sequence of bytes (integers from 0 to 255), just as
it is before PNG scanline filtering is applied. When the bit depth
is 8 this is essentially the same as boxed row flat pixel; when the
bit depth is less than 8, several pixels are packed into each byte;
when the bit depth is 16 (the only value more than 8 that is supported
by the PNG image format) each pixel value is decomposed into 2 bytes
(and packed is a misnomer). This format is used by the
:meth:Writer.write_packed method. It isn't usually a convenient
format, but may be just right if the source data for the PNG image
comes from something that uses a similar format (for example, 1-bit
BMPs, or another PNG file).
And now, my famous members¶
Classes¶
Reader ¶
Reader(**kw)
PNG decoder in pure Python.
Create a PNG decoder object.
The constructor expects exactly one keyword argument. You can choose among the following keyword arguments:
filename
Name of input file (a PNG file).
file
A file-like object (object with a read() method).
bytes
array or string with PNG data.
Methods:¶
chunk ¶
chunk(seek=None)
Read the next PNG chunk from the input file; returns a (type, data) tuple. type is the chunk's type as a byte string (all PNG chunk types are 4 bytes long). data is the chunk's data content, as a byte string.
If the optional seek argument is
specified then it will keep reading chunks until it either runs
out of file or finds the type specified by the argument. Note
that in general the order of chunks in PNGs is unspecified, so
using seek can cause you to miss chunks.
undo_filter ¶
undo_filter(filter_type, scanline, previous)
Undo the filter for a scanline. scanline is a sequence of
bytes that does not include the initial filter type byte.
previous is decoded previous scanline (for straightlaced
images this is the previous pixel row, but for interlaced
images, it is the previous scanline in the reduced image, which
in general is not the previous pixel row in the final image).
When there is no previous scanline (the first row of a
straightlaced image, or the first row in one of the passes in an
interlaced image), then this argument should be None.
The scanline will have the effects of filtering removed, and the result will be returned as a fresh sequence of bytes.
deinterlace ¶
deinterlace(raw)
Read raw pixel data, undo filters, deinterlace, and flatten. Return in flat row flat pixel format.
iterboxed ¶
iterboxed(rows)
Iterator that yields each scanline in boxed row flat pixel
format. rows should be an iterator that yields the bytes of
each row in turn.
serialtoflat ¶
serialtoflat(data, width=None)
Convert serial format (byte stream) pixel data to flat row flat pixel.
iterstraight ¶
iterstraight(raw)
Iterator that undoes the effect of filtering, and yields
each row in serialised format (as a sequence of bytes).
Assumes input is straightlaced. raw should be an iterable
that yields the raw bytes in chunks of arbitrary size.
validate_signature ¶
validate_signature()
If signature (header) has not been read then read and validate it; otherwise do nothing.
preamble ¶
preamble()
Extract the image metadata by reading the initial part of
the PNG file up to the start of the IDAT chunk. All the
chunks that precede the IDAT chunk are read and either
processed for metadata or discarded.
chunklentype ¶
chunklentype()
Reads just enough of the input to determine the next
chunk's length and type, returned as a (length, type) pair
where type is a string. If there are no more chunks, None
is returned.
process_chunk ¶
process_chunk()
Process the next chunk and its data. This only processes the
following chunk types, all others are ignored: IHDR,
PLTE, bKGD, tRNS, gAMA, sBIT, pHYs.
read ¶
read()
Read the PNG file and decode it. Returns (width, height,
pixels, metadata).
May use excessive memory.
pixels are returned in boxed row flat pixel format.
read_flat ¶
read_flat()
Read a PNG file and decode it into flat row flat pixel format. Returns (width, height, pixels, metadata).
May use excessive memory.
pixels are returned in flat row flat pixel format.
See also the :meth:read method which returns pixels in the
more stream-friendly boxed row flat pixel format.
palette ¶
palette(alpha=False)
Returns a palette that is a sequence of 3-tuples or 4-tuples,
synthesizing it from the PLTE and tRNS chunks. These
chunks should have already been processed (for example, by
calling the :meth:preamble method). All the tuples are the
same size: 3-tuples if there is no tRNS chunk, 4-tuples when
there is a tRNS chunk. Assumes that the image is colour type
3 and therefore a PLTE chunk is required.
If the alpha argument is True then an alpha channel is
always added, forcing the result to be a sequence of 4-tuples.
asDirect ¶
asDirect()
Returns the image data as a direct representation of an
x * y * planes array. This method is intended to remove the
need for callers to deal with palettes and transparency
themselves. Images with a palette (colour type 3)
are converted to RGB or RGBA; images with transparency (a
tRNS chunk) are converted to LA or RGBA as appropriate.
When returned in this format the pixel values represent the
colour value directly without needing to refer to palettes or
transparency information.
Like the :meth:read method this method returns a 4-tuple:
(width, height, pixels, meta)
This method normally returns pixel values with the bit depth
they have in the source image, but when the source PNG has an
sBIT chunk it is inspected and can reduce the bit depth of
the result pixels; pixel values will be reduced according to
the bit depth specified in the sBIT chunk (PNG nerds should
note a single result bit depth is used for all channels; the
maximum of the ones specified in the sBIT chunk. An RGB565
image will be rescaled to 6-bit RGB666).
The meta dictionary that is returned reflects the direct
format and not the original source image. For example, an RGB
source image with a tRNS chunk to represent a transparent
colour, will have planes=3 and alpha=False for the
source image, but the meta dictionary returned by this method
will have planes=4 and alpha=True because an alpha
channel is synthesized and added.
pixels is the pixel data in boxed row flat pixel format (just
like the :meth:read method).
All the other aspects of the image data are not changed.
asRGB8 ¶
asRGB8()
Return the image data as an RGB pixels with 8-bits per
sample. This is like the :meth:asRGB method except that
this method additionally rescales the values so that they
are all between 0 and 255 (8-bit). In the case where the
source image has a bit depth < 8 the transformation preserves
all the information; where the source image has bit depth
8, then rescaling to 8-bit values loses precision. No dithering is performed. Like :meth:
asRGB, an alpha channel in the source image will raise an exception.
This function returns a 4-tuple:
(width, height, pixels, metadata).
width, height, metadata are as per the
:meth:read method.
pixels is the pixel data in boxed row flat pixel format.
asRGBA8 ¶
asRGBA8()
Return the image data as RGBA pixels with 8-bits per
sample. This method is similar to :meth:asRGB8 and
:meth:asRGBA: The result pixels have an alpha channel, and
values are rescaled to the range 0 to 255. The alpha channel is
synthesized if necessary (with a small speed penalty).
asRGB ¶
asRGB()
Return image as RGB pixels. RGB colour images are passed through unchanged; greyscales are expanded into RGB triplets (there is a small speed overhead for doing this).
An alpha channel in the source image will raise an exception.
The return values are as for the :meth:read method
except that the metadata reflect the returned pixels, not the
source image. In particular, for this method
metadata['greyscale'] will be False.
asRGBA ¶
asRGBA()
Return image as RGBA pixels. Greyscales are expanded into
RGB triplets; an alpha channel is synthesized if necessary.
The return values are as for the :meth:read method
except that the metadata reflect the returned pixels, not the
source image. In particular, for this method
metadata['greyscale'] will be False, and
metadata['alpha'] will be True.
pngfilters ¶
Methods:¶
undo_filter_sub
staticmethod
¶
undo_filter_sub(filter_unit, scanline, previous, result)
Undo sub filter.
undo_filter_up
staticmethod
¶
undo_filter_up(filter_unit, scanline, previous, result)
Undo up filter.
undo_filter_average
staticmethod
¶
undo_filter_average(filter_unit, scanline, previous, result)
Undo up filter.
undo_filter_paeth
staticmethod
¶
undo_filter_paeth(filter_unit, scanline, previous, result)
Undo Paeth filter.
convert_l_to_rgba
staticmethod
¶
convert_l_to_rgba(row, result)
Convert a grayscale image to RGBA. This method assumes the alpha channel in result is already correctly initialized.
convert_rgb_to_rgba
staticmethod
¶
convert_rgb_to_rgba(row, result)
Convert an RGB image to RGBA. This method assumes the alpha channel in result is already correctly initialized.
Functions:¶
check_bitdepth_colortype ¶
check_bitdepth_colortype(bitdepth, colortype)
Check that bitdepth and colortype are both valid,
and specified in a valid combination. Returns if valid,
raise an Exception if not valid.