NAME
   Plack::App::ImageMagick - Create and manipulate images with
   Image::Magick

VERSION
   version 1.110990

SYNOPSIS
       # app.psgi
       use Plack::App::ImageMagick;

       my $thumbnailer_app = Plack::App::ImageMagick->new(
           root => '/path/to/images',
           apply => [
               Scale => { geometry => "%{width:-200}x%{height:-120}" },
               Set => { quality => 30 },
           ],
           with_query => 1,
       );

       my $captcha_app = Plack::App::ImageMagick-new(
           apply => [
               Set => { size => "100x20" },
               ReadImage => [
                   'xc:%{bgcolor:-white}',
               ],
               Set => { magick => "png" },
           ],
           post_process => sub {
               my ($app, $env, $img) = @_;

               $img->Annotate(
                   text => random_text( $env->{PATH_INFO} ),
                   fill => 'black',
                   pointsize => 16,
                   gravity => 'Center',
               );
               return $img;
           }
       );

       # and map it later
       use Plack::Builder;
       builder {
           # /thumbs/photo_1.jpg?width=640&height=480
           mount "/thumbs/" => $thumbnailer_app;

           # /captcha/623b1c9b03d4033635a545b54ffc4775.png
           mount "/captcha/" => $captcha_app;
       }

DESCRIPTION
   Use Image::Magick to create and manipulate images for your web
   applications.

CONFIGURATION
   You need to supply "apply" or "handler" configuration options. All other
   parameters are optional.

 apply
       my $app = Plack::App::ImageMagick->new(
           root => '/path/to/images',
           apply => [
               Scale => { geometry => "%{width:-200}x%{height:-120}" },
               Set => { quality => 30 },
           ],
           with_query => 1,
       );

   Array reference of ImageMagick's *method_name* and its *arguments*
   pairs.

   The *arguments* element could be a hash or array reference - both will
   be flatten when passed as *method_name* parameters.

   If used with "root" then attempt will be made to read image located
   there, check "root" for details.

   If "with_query" is specified the "apply" block will be pre-processed to
   replace placeholders with values from query string, check "with_query"
   for more details.

   Results of the following methods will be pushed to @$img:

   *   Clone

   *   EvaluateImages

   *   Fx

   *   Smush

   *   Transform

   Results of the following method will replace current $img object:

   *   FlattenImage

   *Note:* if the @$img object contains more then one layer
   "FlattenImage()" is called before rendering.

   *Note:* "handler" and "apply" are mutually exclusive.

 root
       my $app = Plack::App::ImageMagick->new(
           root => '/path/to/images',
           apply => [ ... ],
       );

   Path to images used in conjunction with "apply" to allow modifications
   of existing images.

   Attempt will be made to read image located there, based on
   "$env->{PATH_INFO}", failure to read image will result in *500 Internal
   Server Error* response.

   In essence it is equal to calling "Read()" before "apply" methods:

           $img->Read( $self->root . $env->{PATH_INFO} );

 with_query
       my $app = Plack::App::ImageMagick->new(
           apply => [
               '%{method:-Scale}' => { geometry => "%{width:-200}x%{height:-120}" },
               Set => { quality => '%{quality:-30}' },
           ],
           with_query => 1,
       );

   Used with "apply" allows to use placeholders which will be replaced with
   values found in query string.

   For details about syntax please see String::Bash.

   User supplied value (from query string) is validated with "\A[\w ]+\z",
   if validation fails *403 Forbidden* will be thrown.

   Please note that providing default values is recommended.

 cache_dir
       my $app = Plack::App::ImageMagick->new(
           cache_dir => '/path/to/cache',
           apply => [ ... ],
       );

   If provided images created will be saved in this directory, with
   filenames based on "$env->{REQUEST_URI}" MD5 checksum.

   However use of reverse proxy for even better performance gain is
   recommended.

 handler
       my $app = Plack::App::ImageMagick->new(
           handler => sub {
               my ($app, $env, $img) = @_;

               # process $img
               ...

               return $img;
           },
       );

   Sub reference called with following parameters:

   $app
       Reference to current Plack::App::ImageMagick object.

   $env
       Reference to current $env.

   $img
       Reference to Image::Magick object created with:

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

   *Note:* if returned @$img object contains more then one layer
   "FlattenImage()" is called before rendering.

   *Note:* "handler" and "apply" are mutually exclusive.

 pre_process
       my $app = Plack::App::ImageMagick->new(
           pre_process => sub {
               my ($app, $env, $img) = @_;

               # process $img
               ...

               return $img;
           },
           apply => [ ... ],
       );

   Sub reference called before "apply" methods are processed, with same
   parameters as "handler".

   Returns $img which is processed later by methods defined in "apply".

 post_process
       my $app = Plack::App::ImageMagick->new(
           apply => [ ... ],
           post_process => sub {
               my ($app, $env, $img) = @_;

               # process $img
               ...

               return $img;
           },
       );

   Sub reference called after "apply" (with $img processed by its methods),
   with same parameters as "handler".

   *Note:* if the @$img object contains more then one layer
   "FlattenImage()" is called before rendering.

SEE ALSO
   *   Image::Magick

   *   Plack

   *   String::Bash

AUTHOR
   Alex J. G. Burzyński <[email protected]>

COPYRIGHT AND LICENSE
   This software is copyright (c) 2011 by Alex J. G. Burzyński
   <[email protected]>.

   This is free software; you can redistribute it and/or modify it under
   the same terms as the Perl 5 programming language system itself.