Björn Höhrmann

NAME

Image::PNG::Rewriter - Rewrite and Refilter PNG images

SYNOPSIS

  use Image::PNG::Rewriter;

  open my $h, '<', '...';
  binmode $h;
  my $re = Image::PNG::Rewriter->new(handle => $h, zlib => \&zlib);

  my $width = $re->width;
  my $height = $re->height;
  my $mode = $re->color_mode;
  my $depth = $re->depth;
  my @chunks = $re->original_chunks;
  my $orig_deflated = $re->original_deflated;
  my $orig_inflated = $re->original_inflated;
  my @filters = $re->original_filters;
  my $new_deflated = $re->refilter(@filters);
  my $new_png = $re->as_png;

DESCRIPTION

This module offers low-level access to PNG image data. The primary purpose is to support rewriting IDAT chunks which hold the main image data. IDAT chunks can be coalesced, re-compressed, and the filters applied to each scanline in the image to support compression can be retrieved and changed. Modified data can be serialized to a new PNG image, leaving unmodified data intact.

METHODS

my $rw = Image::PNG::Rewriter->new(%options)

Constructs a new Image::PNG::Rewriter object. The possible options are a required handle parameter which must be an opened handle that can be read from; it is expected that the handle is in binary mode. Note that open supports turning strings into a handle.

The other parameter is zlib which must be a reference to a subroutine that takes some byte string and returns a deflated representation of it that follows the RFC 1950 "zlib" format (neither a raw RFC 1951 stream nor a RFC 1952 "gzip" stream are allowed). The default value uses Compress::Zlib with default settings. The routine must not modify its input.

$rw->width

Returns the width specified in the IHDR chunk.

$rw->height

Returns the height specified in the IHDR chunk.

$rw->depth

Returns the depth specified in the IHDR chunk.

$rw->color_mode

Returns the color mode specified in the IHDR chunk.

$re->original_chunks

Returns a list of hash references containing the keys type, size, data, and crc32, containing, respectively, the type of the chunk, the size of the data in the chunk in bytes, the raw data contained in the chunk, and the CRC32 checksum in the original chunk.

$re->original_deflated

The raw RFC 1950-encoded coalesced data of all IDAT chunks in the image.

$re->original_inflated

As $re->original_deflated but inflated.

$re->original_filters

A list containing the filters applied to the scanlines in the image. The length is equivalent to the height of the image.

$re->as_png

Returns a byte string representing the original image except that all original IDAT chunks are replaced by a single IDAT chunk with any changes that may have been applied to the data.

my ($deflated, $inflated) = $re->refilter(1,2,3,...)

Re-encodes the image data by removing the filter that had been applied to the input and applies the new filters. The number of filters must be equal to the number of scanlines in the image (the image's height). Only supports filters 0 through 4. Returns a list containing the deflated and inflated date after applying the new filters. The values should not be modified.

$re->scanline_width

Returns the number of bytes contained within each scanline. The size of the raw image data is this value times the image's height. Note that each scanline starts with a byte that identifies the filter that has been applied to it.

$re->scanline_delta

Returns the number of bytes between two "corresponding" values on a scanline. The number of bytes per pixel or 1 if pixels occupy less space than a byte.

SEE ALSO

http://www.w3.org/TR/PNG/
Compress::Deflate7
Compress::Zlib

AUTHOR / COPYRIGHT / LICENSE

  Copyright (c) 2011 Bjoern Hoehrmann <bjoern@hoehrmann.de>.
  This module is licensed under the same terms as Perl itself.