Image::Magick::Iterator - sequentially read Image::Magick object from


Image-Magick-Iterator documentation Contained in the Image-Magick-Iterator distribution.

Index


Code Index:

NAME

Top

Image::Magick::Iterator - sequentially read Image::Magick object from a filehandle.

SYNOPSIS

Top

  use strict;
  use Image::Magick::Iterator;

  my $iter = Image::Magick::Iterator->new();

  #assume PPM stream is coming from STDIN;
  $iter->handle(\*STDIN);

  #explicitly set format to PPM, there is no auto-detection built in
  $iter->format('PPM');

  while(my $image = $iter->next){
    print $image->Get('height'),"\n"; #access height attribute of each
                                      #Image::Magick object
  }

DESCRIPTION

Top

Image::Magick::Iterator adds iteration support to Image::Magick. This means that if you have a stream of concatenated images, you can access each image in the stream as an independent Image::Magick object.

Iteration functionality is not present in Image::Magick itself as of version 5.56. Passing a stream of concatenated images would result in essentially a "stack" of images which would all be manipulated in parallel by any Image::Magick calls. Calls to Write() either output an animated series of image (a la animated GIFs), or the first image in the series.

Image::Magick::Iterator is extensible to support many different image filetypes. Currently only PPM support is implemented. See /SYNOPSIS (SYOPSIS) for an example.

SUPPORTED FORMATS

Top

Currently only PPM images can be iterated. It's not difficult to add new image types though, and I'm receptive to new classes for handling more formats. To add another format:

1. Have a look at the source of Image::Magick::Iterator::PPM to get an idea of how to write a new format handling class. It is basically a class with one method, read_image, that when given a filehandle reference reads an image from it and passes back the raw data.

2. add a mapping to _delegate() that maps the desired value of format() to your image reading class.

FEEDBACK

Top

Email the author.

AUTHOR

Top

Allen Day <allenday@ucla.edu>

COPYRIGHT AND LICENSE

Top

APPENDIX

Top

The rest of the documentation details each of the object methods. Internal methods are usually preceded with a '_'. Methods are in alphabetical order for the most part.

new()

Usage
  my $obj = new Image::Magick::Iterator();

Function

Builds a new Image::Magick::Iterator object

Returns

an instance of Image::Magick::Iterator

Arguments

None

init()

Usage
  $obj->init(%arg);

Function

Internal method to initialize a new Image::Magick::Iterator object

Returns

true on success

Arguments

Arguments passed to new()

format()

Usage
  $obj->format();        #get existing value

  $obj->format($newval); #set new value

Function

stores a scalar value of the fileformat to be read from handle(). currently supported formats are:

  * PPM

Returns

value of format (a scalar)

Arguments

(optional) on set, a scalar

handle()

Usage
  $obj->handle();        #get existing value

  $obj->handle($newval); #set new value

Function

stores a filehandle reference (eg \*STDIN, or an IO::Handle.

Returns

value of handle (a scalar)

Arguments

(optional) on set, a scalar

next()

Usage
  $obj->next(); #get next Image::Magick from stream

Function

reads an Image::Magick object from a filehandle.

Returns

a Image::Magick object, or undef if the filehandle is EOF or contains only a partial image.

Arguments

none, read-only

_delegate()

Usage
  $obj->_delegate($format);

Function

internal method, maps format names to class names

Returns

class to be delegated to for reading an image of the specified format

Arguments

name of an image format


Image-Magick-Iterator documentation Contained in the Image-Magick-Iterator distribution.

# Let the code begin...


package Image::Magick::Iterator;
use strict;
use base qw();
our $VERSION = '0.01';

use File::Temp;
use Image::Magick;

sub new {
  my($class,%arg) = @_;

  my $self = bless {}, $class;
  $self->init(%arg);

  return $self;
}

sub init {
  my($self,%arg) = @_;

  foreach my $arg (keys %arg){
    $self->$arg($arg{$arg}) if $self->can($arg);
  }

  return 1;
}

sub format {
  my($self,$val) = @_;
  $self->{'format'} = $val if defined($val);
  return $self->{'format'};
}

sub handle {
  my($self,$val) = @_;
  $self->{'handle'} = $val if defined($val);
  return $self->{'handle'};
}

sub next {
  my $self = shift;

  my $image = undef;

  my $delegate = $self->_delegate($self->format());

  eval "require $delegate";
  if($@){ die "couldn't load delegate class '$delegate': $@" }

  my $raw = $delegate->read_image($self->handle);

  return undef unless $raw;

  my $tmp = File::Temp->new(UNLINK => 1);
  print $tmp $raw;

  $image = Image::Magick->new();

  close($tmp);

  open(IN,"$tmp");
  $image->Read(file => \*IN);
  close(IN);

  return $image;
}

sub _delegate {
  my ($self,$format) = @_;

  my %map = (
             PPM => 'Image::Magick::Iterator::PPM',
            );

  return $map{$format};
}


1;