]> git.imager.perl.org - imager.git/blob - lib/Imager/Transformations.pod
43bbb33de632ccb8fcb5016459c5906cce22cbb5
[imager.git] / lib / Imager / Transformations.pod
1 =head1 NAME
2
3 Imager::Transformations - Simple transformations of one image into another.
4
5 =head1 SYNOPSIS
6
7   use Imager;
8
9   $newimg = $img->copy();
10
11   $newimg = $img->scale(xpixels=>400, qtype => 'mixing');
12   $newimg = $img->scale(xpixels=>400, ypixels=>400);
13   $newimg = $img->scale(xpixels=>400, ypixels=>400, type=>'min');
14   $newimg = $img->scale(scalefactor=>0.25);
15
16   $newimg = $img->scaleX(pixels=>400);
17   $newimg = $img->scaleX(scalefactor=>0.25);
18   $newimg = $img->scaleY(pixels=>400);
19   $newimg = $img->scaleY(scalefactor=>0.25);
20
21   $newimg = $img->crop(left=>50, right=>100, top=>10, bottom=>100); 
22   $newimg = $img->crop(left=>50, top=>10, width=>50, height=>90);
23
24   $dest->paste(left=>40,top=>20,img=>$logo);
25
26   $img->rubthrough(src=>$srcimage,tx=>30, ty=>50);
27   $img->rubthrough(src=>$srcimage,tx=>30, ty=>50,
28                    src_minx=>20, src_miny=>30,
29                    src_maxx=>20, src_maxy=>30);
30
31
32   $img->flip(dir=>"h");       # horizontal flip
33   $img->flip(dir=>"vh");      # vertical and horizontal flip
34   $newimg = $img->copy->flip(dir=>"v"); # make a copy and flip it vertically
35
36   my $rot20 = $img->rotate(degrees=>20);
37   my $rotpi4 = $img->rotate(radians=>3.14159265/4);
38
39
40   # Convert image to gray
41   $new = $img->convert(preset=>'grey');          
42
43   # Swap red/green channel  
44   $new = $img->convert(matrix=>[ [ 0, 1, 0 ],
45                                  [ 1, 0, 0 ],
46                                  [ 0, 0, 1 ] ]);
47
48   # limit the range of red channel from 0..255 to 0..127
49   @map = map { int( $_/2 } 0..255;
50   $img->map( red=>\@map );
51
52   # Apply a Gamma of 1.4
53   my $gamma = 1.4;
54   my @map = map { int( 0.5 + 255*($_/255)**$gamma ) } 0..255;
55   $img->map(all=>\@map);  # inplace conversion
56
57 =head1 DESCRIPTION
58
59 The methods described in Imager::Transformations fall into two categories.
60 Either they take an existing image and modify it in place, or they 
61 return a modified copy.
62
63 Functions that modify inplace are C<flip()>, C<paste()> and
64 C<rubthrough()>.  If the original is to be left intact it's possible
65 to make a copy and alter the copy:
66
67   $flipped = $img->copy()->flip(dir=>'h');
68
69 =head2 Image copying/resizing/cropping/rotating
70
71 A list of the transformations that do not alter the source image follows:
72
73 =over
74
75 =item copy
76
77 To create a copy of an image use the C<copy()> method.  This is usefull
78 if you want to keep an original after doing something that changes the image.
79
80   $newimg = $orig->copy();
81
82 =item scale
83
84 X<scale>To scale an image so porportions are maintained use the
85 C<$img-E<gt>scale()> method.  if you give either a xpixels or ypixels
86 parameter they will determine the width or height respectively.  If
87 both are given the one resulting in a larger image is used, unless you
88 set the C<type> parameter to C<'min'>.  example: C<$img> is 700 pixels
89 wide and 500 pixels tall.
90
91   $newimg = $img->scale(xpixels=>400); # 400x285
92   $newimg = $img->scale(ypixels=>400); # 560x400
93
94   $newimg = $img->scale(xpixels=>400,ypixels=>400); # 560x400
95   $newimg = $img->scale(xpixels=>400,ypixels=>400,type=>'min'); # 400x285
96
97   $newimg = $img->scale(xpixels=>400, ypixels=>400),type=>'nonprop'); # 400x400
98
99   $newimg = $img->scale(scalefactor=>0.25); 175x125 
100   $newimg = $img->scale(); # 350x250
101
102 If you want to create low quality previews of images you can pass
103 C<qtype=E<gt>'preview'> to scale and it will use nearest neighbor
104 sampling instead of filtering. It is much faster but also generates
105 worse looking images - especially if the original has a lot of sharp
106 variations and the scaled image is by more than 3-5 times smaller than
107 the original.
108
109 =over
110
111 =item *
112
113 xpixels, ypixels - desired size of the scaled image.  The C<type>
114 parameter controls whether the larger or smaller of the two possible
115 sizes is chosen, or if the image is scaled non-proportionally.
116
117 =item *
118
119 constrain - an Image::Math::Constrain object defining the way in which
120 the image size should be constrained.
121
122 =item *
123
124 scalefactor - if none of xpixels, ypixels, xscalefactor, yscalefactor
125 or constrain is supplied then this is used as the ratio to scale by.
126 Default: 0.5.
127
128 =item *
129
130 xscalefactor, yscalefactor - if both are supplied then the image is
131 scaled as per these parameters, whether this is proportionally or not.
132 New in Imager 0.54.
133
134 =item *
135
136 type - controls whether the larger or smaller of the two possible
137 sizes is chosen, possible values are:
138
139 =over
140
141 =item *
142
143 min - the smaller of the 2 sizes are chosen.
144
145 =item *
146
147 max - the larger of the 2 sizes.  This is the default.
148
149 =item *
150
151 nonprop - non-proportional scaling.  New in Imager 0.54.
152
153 =back
154
155 scale() will fail if C<type> is set to some other value.
156
157 For example, if the original image is 400 pixels wide by 200 pixels
158 high and C<xpixels> is set to 300, and C<ypixels> is set to 160.  When
159 C<type> is C<'min'> the resulting image is 300 x 150, when C<type> is
160 C<'max'> the resulting image is 320 x 150.
161
162 C<type> is only used if both C<xpixels> and C<ypixels> are supplied.
163
164 =item *
165
166 qtype - defines the quality of scaling performed.  Possible values are:
167
168 =over
169
170 =item *
171
172 C<normal> - high quality scaling.  This is the default.
173
174 =item *
175
176 C<preview> - lower quality.  When scaling down this will skip input
177 pixels, eg. scaling by 0.5 will skip every other pixel.  When scaling
178 up this will duplicate pixels.
179
180 =item *
181
182 C<mixing> - implements the mixing algorithm implemented by pnmscale.
183 This retains more detail when scaling down than C<normal>.  When
184 scaling down this proportionally accumulates sample data from the
185 pixels, resulting in a proportional mix of all of the pixels.  When
186 scaling up this will mix pixels when the sampling grid crosses a pixel
187 boundary but will otherwise copy pixel values.
188
189 =back
190
191 scale() will fail if C<qtype> is set to some other value.
192
193 C<preview> is faster than C<mixing> which is much faster than C<normal>.
194
195 =back
196
197 To scale an image on a given axis without maintaining proportions, it
198 is best to call the scaleX() and scaleY() methods with the required
199 dimensions. eg.
200
201   my $scaled = $img->scaleX(pixels=>400)->scaleY(pixels=>200);
202
203 From Imager 0.54 you can scale without maintaining proportions either
204 by supplying both the xscalefactor and yscalefactor arguments:
205
206   my $scaled = $img->scale(xscalefactor => 0.5, yscalefactor => 0.67);
207
208 or by supplying C<xpixels> and C<ypixels> and setting C<type> to
209 "nonprop":
210
211   my $scaled = $im->scale(xpixels => 200, ypixels => 200, type => 'nonprop');
212
213 Returns a new scaled image on success.  The source image is not
214 modified.
215
216 Returns false on failure, check the errstr() method for the reason for
217 failure.
218
219 A mandatory warning is produced if scale() is called in void context.
220
221   # setup
222   my $image = Imager->new;
223   $image->read(file => 'somefile.jpg')
224     or die $image->errstr;
225
226   # all full quality unless indicated otherwise
227   # half the size:
228   my $half = $image->scale;
229
230   # double the size
231   my $double = $image->scale(scalefactor => 2.0);
232
233   # so a 400 x 400 box fits in the resulting image:
234   my $fit400x400inside = $image->scale(xpixels => 400, ypixels => 400);
235   my $fit400x400inside2 = $image->scale(xpixels => 400, ypixels => 400,
236                                         type=>'max');
237
238   # fit inside a 400 x 400 box
239   my $inside400x400 = $image->scale(xpixels => 400, ypixels => 400,
240                               type=>'min');
241
242   # make it 400 pixels wide or high
243   my $width400 = $image->scale(xpixels => 400);
244   my $height400 = $image->scale(ypixels => 400);
245
246   # low quality scales:
247   # to half size
248   my $low = $image->scale(qtype => 'preview');
249
250   # mixing method scale
251   my $mixed = $image->scale(qtype => 'mixing', scalefactor => 0.1);
252
253   # using an Image::Math::Constrain object
254   use Image::Math::Constrain;
255   my $constrain = Image::Math::Constrain->new(800, 600);
256   my $scaled = $image->scale(constrain => $constrain);
257
258   # same as Image::Math::Constrain version
259   my $scaled2 = $image->scale(xpixels => 800, ypixels => 600, type => 'min');
260
261 =item scaleX
262
263 scaleX() will scale along the X dimension, return a new image with the
264 new width:
265
266   my $newimg = $img->scaleX(pixels=>400); # 400x500
267   $newimg = $img->scaleX(scalefactor=>0.25) # 175x500
268
269 =over
270
271 =item *
272
273 scalefactor - the amount to scale the X axis.  Ignored if C<pixels> is
274 provided.  Default: 0.5.
275
276 =item *
277
278 pixels - the new width of the image.
279
280 =back
281
282 Returns a new scaled image on success.  The source image is not
283 modified.
284
285 Returns false on failure, check the errstr() method for the reason for
286 failure.
287
288 A mandatory warning is produced if scaleX() is called in void context.
289
290 =item scaleY
291
292 scaleY() will scale along the Y dimension, return a new image with the
293 new height:
294
295   $newimg = $img->scaleY(pixels=>400); # 700x400
296   $newimg = $img->scaleY(scalefactor=>0.25) # 700x125
297
298 =over
299
300 =item *
301
302 scalefactor - the amount to scale the Y axis.  Ignored if C<pixels> is
303 provided.  Default: 0.5.
304
305 =item *
306
307 pixels - the new height of the image.
308
309 =back
310
311 Returns a new scaled image on success.  The source image is not
312 modified.
313
314 Returns false on failure, check the errstr() method for the reason for
315 failure.
316
317 A mandatory warning is produced if scaleY() is called in void context.
318
319 =item crop
320
321 Another way to resize an image is to crop it.  The parameters to
322 crop are the edges of the area that you want in the returned image,
323 where the right and bottom edges are non-inclusive.  If a parameter is
324 omitted a default is used instead.
325
326 crop() returns the cropped image and does not modify the source image.
327
328 The possible parameters are:
329
330 =over
331
332 =item *
333
334 C<left> - the left edge of the area to be cropped.  Default: 0
335
336 =item *
337
338 C<top> - the top edge of the area to be cropped.  Default: 0
339
340 =item *
341
342 C<right> - the right edge of the area to be cropped.  Default: right
343 edge of image.
344
345 =item *
346
347 C<bottom> - the bottom edge of the area to be cropped.  Default:
348 bottom edge of image.
349
350 =item *
351
352 C<width> - width of the crop area.  Ignored if both C<left> and C<right> are
353 supplied.  Centered on the image if neither C<left> nor C<right> are
354 supplied.
355
356 =item *
357
358 C<height> - height of the crop area.  Ignored if both C<top> and
359 C<bottom> are supplied.  Centered on the image if neither C<top> nor
360 C<bottom> are supplied.
361
362 =back
363
364 For example:
365
366   # these produce the same image
367   $newimg = $img->crop(left=>50, right=>100, top=>10, bottom=>100); 
368   $newimg = $img->crop(left=>50, top=>10, width=>50, height=>90);
369   $newimg = $img->crop(right=>100, bottom=>100, width=>50, height=>90);
370
371   # and the following produce the same image
372   $newimg = $img->crop(left=>50, right=>100);
373   $newimg = $img->crop(left=>50, right=>100, top=>0, 
374                        bottom=>$img->getheight);
375
376   # grab the top left corner of the image
377   $newimg = $img->crop(right=>50, bottom=>50);
378
379 You can also specify width and height parameters which will produce a
380 new image cropped from the center of the input image, with the given
381 width and height.
382
383   $newimg = $img->crop(width=>50, height=>50);
384
385 If you supply C<left>, C<width> and C<right> values, the C<right>
386 value will be ignored.  If you supply C<top>, C<height> and C<bottom>
387 values, the C<bottom> value will be ignored.
388
389 The edges of the cropped area default to the edges of the source
390 image, for example:
391
392   # a vertical bar from the middle from top to bottom
393   $newimg = $img->crop(width=>50);
394
395   # the right half
396   $newimg = $img->crop(left=>$img->getwidth() / 2);
397
398 If the resulting image would have zero width or height then crop()
399 returns false and $img->errstr is an appropriate error message.
400
401 A mandatory warning is produced if crop() is called in void context.
402
403 =item rotate
404
405 Use the rotate() method to rotate an image.  This method will return a
406 new, rotated image.
407
408 To rotate by an exact amount in degrees or radians, use the 'degrees'
409 or 'radians' parameter:
410
411   my $rot20 = $img->rotate(degrees=>20);
412   my $rotpi4 = $img->rotate(radians=>3.14159265/4);
413
414 Exact image rotation uses the same underlying transformation engine as
415 the matrix_transform() method (see Imager::Engines).
416
417 You can also supply a C<back> argument which acts as a background
418 color for the areas of the image with no samples available (outside
419 the rectangle of the source image.)  This can be either an
420 Imager::Color or Imager::Color::Float object.  This is B<not> mixed
421 transparent pixels in the middle of the source image, it is B<only>
422 used for pixels where there is no corresponding pixel in the source
423 image.
424
425 To rotate in steps of 90 degrees, use the 'right' parameter:
426
427   my $rotated = $img->rotate(right=>270);
428
429 Rotations are clockwise for positive values.
430
431 Parameters:
432
433 =over
434
435 =item *
436
437 right - rotate by an exact multiple of 90 degrees, specified in
438 degreess.
439
440 =item *
441
442 radians - rotate by an angle specified in radians.
443
444 =item *
445
446 degrees - rotate by an angle specified in degrees.
447
448 =item *
449
450 back - for C<radians> and C<degrees> this is the color used for the
451 areas not covered by the original image.  For example, the corners of
452 an image rotated by 45 degrees.
453
454 This can be either an Imager::Color object, an Imager::Color::Float
455 object or any parameter that Imager can convert to a color object, see
456 L<Imager::Draw/Color Parameters> for details.
457
458 This is B<not> mixed transparent pixels in the middle of the source
459 image, it is B<only> used for pixels where there is no corresponding
460 pixel in the source image.
461
462 Default: transparent black.
463
464 =back
465
466   # rotate 45 degrees clockwise, 
467   my $rotated = $img->rotate(degrees => 45);
468
469   # rotate 10 degrees counter-clockwise
470   # set pixels not sourced from the original to red
471   my $rotated = $img->rotate(degrees => -10, back => 'red');
472
473 =back
474
475 =head2 Image pasting/flipping
476
477 A list of the transformations that alter the source image follows:
478
479 =over
480
481 =item paste
482
483 X<paste>To copy an image to onto another image use the C<paste()>
484 method.
485
486   $dest->paste(left=>40, top=>20, src=>$logo);
487
488 That copies the entire C<$logo> image onto the C<$dest> image so that the
489 upper left corner of the C<$logo> image is at (40,20).
490
491 Parameters:
492
493 =over
494
495 =item *
496
497 src, img - the source image.  I<src> added for compatibility with
498 rubthrough().
499
500 =item *
501
502 left, top - position in output of the top left of the pasted image.
503 Default: (0,0)
504
505 =item *
506
507 src_minx, src_miny - the top left corner in the source image to start
508 the paste from.  Default: (0, 0)
509
510 =item *
511
512 src_maxx, src_maxy - the bottom right in the source image of the sub
513 image to paste.  This position is B<non> inclusive.  Default: bottom
514 right corner of the source image.
515
516 =item *
517
518 width, height - if the corresponding src_maxx or src_maxy is not
519 defined then width or height is used for the width or height of the
520 sub image to be pasted.
521
522 =back
523
524   # copy the 20x20 pixel image from (20,20) in $src_image to (10,10) in $img
525   $img->paste(src=>$src_image,
526               left => 10, top => 10,
527               src_minx => 20, src_miny => 20,
528               src_maxx => 40, src_maxx => 40);
529               
530 =item rubthrough
531
532 A more complicated way of blending images is where one image is
533 put 'over' the other with a certain amount of opaqueness.  The
534 method that does this is rubthrough.
535
536   $img->rubthrough(src=>$overlay,
537                    tx=>30,       ty=>50,
538                    src_minx=>20, src_miny=>30,
539                    src_maxx=>20, src_maxy=>30);
540
541 That will take the sub image defined by I<$overlay> and
542 I<[src_minx,src_maxx)[src_miny,src_maxy)> and overlay it on top of
543 I<$img> with the upper left corner at (30,50).  You can rub 2 or 4
544 channel images onto a 3 channel image, or a 2 channel image onto a 1
545 channel image.  The last channel is used as an alpha channel.  To add
546 an alpha channel to an image see I<convert()>.
547
548 Parameters:
549
550 =over
551
552 =item *
553
554 tx, ty - location in the the target image ($self) to render the top
555 left corner of the source.
556
557 =item *
558
559 src_minx, src_miny - the top left corner in the source to transfer to
560 the target image.  Default: (0, 0).
561
562 =item *
563
564 src_maxx, src_maxy - the bottom right in the source image of the sub
565 image to overlay.  This position is B<non> inclusive.  Default: bottom
566 right corner of the source image.
567
568 =back
569
570   # overlay all of $source onto $targ
571   $targ->rubthrough(tx => 20, ty => 25, src => $source);
572
573   # overlay the top left corner of $source onto $targ
574   $targ->rubthrough(tx => 20, ty => 25, src => $source,
575                     src_maxx => 20, src_maxy => 20);
576
577   # overlay the bottom right corner of $source onto $targ
578   $targ->rubthrough(tx => 20, ty => 30, src => $src,
579                     src_minx => $src->getwidth() - 20,
580                     src_miny => $src->getheight() - 20);
581
582 rubthrough() returns true on success.  On failure check
583 $target->errstr for the reason for failure.
584
585 =item flip
586
587 An inplace horizontal or vertical flip is possible by calling the
588 C<flip()> method.  If the original is to be preserved it's possible to
589 make a copy first.  The only parameter it takes is the C<dir>
590 parameter which can take the values C<h>, C<v>, C<vh> and C<hv>.
591
592   $img->flip(dir=>"h");       # horizontal flip
593   $img->flip(dir=>"vh");      # vertical and horizontal flip
594   $nimg = $img->copy->flip(dir=>"v"); # make a copy and flip it vertically
595
596 flip() returns true on success.  On failure check $img->errstr for the
597 reason for failure.
598
599 =back
600
601 =head2 Color transformations
602
603 =over
604
605 =item convert
606
607 You can use the convert method to transform the color space of an
608 image using a matrix.  For ease of use some presets are provided.
609
610 The convert method can be used to:
611
612 =over
613
614 =item *
615
616 convert an RGB or RGBA image to grayscale.
617
618 =item *
619
620 convert a grayscale image to RGB.
621
622 =item *
623
624 extract a single channel from an image.
625
626 =item *
627
628 set a given channel to a particular value (or from another channel)
629
630 =back
631
632 The currently defined presets are:
633
634 =over
635
636 =item gray
637
638 =item grey
639
640 converts an RGBA image into a grayscale image with alpha channel, or
641 an RGB image into a grayscale image without an alpha channel.
642
643 This weights the RGB channels at 22.2%, 70.7% and 7.1% respectively.
644
645 =item noalpha
646
647 removes the alpha channel from a 2 or 4 channel image.  An identity
648 for other images.
649
650 =item red
651
652 =item channel0
653
654 extracts the first channel of the image into a single channel image
655
656 =item green
657
658 =item channel1
659
660 extracts the second channel of the image into a single channel image
661
662 =item blue
663
664 =item channel2
665
666 extracts the third channel of the image into a single channel image
667
668 =item alpha
669
670 extracts the alpha channel of the image into a single channel image.
671
672 If the image has 1 or 3 channels (assumed to be grayscale of RGB) then
673 the resulting image will be all white.
674
675 =item rgb
676
677 converts a grayscale image to RGB, preserving the alpha channel if any
678
679 =item addalpha
680
681 adds an alpha channel to a grayscale or RGB image.  Preserves an
682 existing alpha channel for a 2 or 4 channel image.
683
684 =back
685
686 For example, to convert an RGB image into a greyscale image:
687
688   $new = $img->convert(preset=>'grey'); # or gray
689
690 or to convert a grayscale image to an RGB image:
691
692   $new = $img->convert(preset=>'rgb');
693
694 The presets aren't necessary simple constants in the code, some are
695 generated based on the number of channels in the input image.
696
697 If you want to perform some other colour transformation, you can use
698 the 'matrix' parameter.
699
700 For each output pixel the following matrix multiplication is done:
701
702   | channel[0] |   | $c00, ...,  $c0k |   | inchannel[0] |
703   |    ...     | = |       ...        | x |     ...      |
704   | channel[k] |   | $ck0, ...,  $ckk |   | inchannel[k] |
705                                                           1
706 Where C<k = $img-E<gt>getchannels()-1>.
707
708 So if you want to swap the red and green channels on a 3 channel image:
709
710   $new = $img->convert(matrix=>[ [ 0, 1, 0 ],
711                                  [ 1, 0, 0 ],
712                                  [ 0, 0, 1 ] ]);
713
714 or to convert a 3 channel image to greyscale using equal weightings:
715
716   $new = $img->convert(matrix=>[ [ 0.333, 0.333, 0.334 ] ])
717
718 Convert a 2 channel image (grayscale with alpha) to an RGBA image with
719 the grey converted to the specified RGB color:
720
721   # set (RGB) scaled on the grey scale portion and copy the alpha
722   # channel as is
723   my $colored = $gray->convert(matrix=>[ [ ($red/255),   0 ], 
724                                          [ ($green/255), 0 ], 
725                                          [ ($blue/255),  0 ], 
726                                          [ 0,            1 ],
727                                        ]);
728
729 To convert a 3 channel image to a 4 channel image with a 50 percent
730 alpha channel:
731
732   my $withalpha = $rgb->convert(matrix =>[ [ 1, 0, 0, 0 ],
733                                            [ 0, 1, 0, 0 ],
734                                            [ 0, 0, 1, 0 ],
735                                            [ 0, 0, 0, 0.5 ],
736                                          ]);
737
738 =back
739
740 =head2 Color Mappings
741
742 =over
743
744 =item map
745
746 You can use the map method to map the values of each channel of an
747 image independently using a list of lookup tables.  It's important to
748 realize that the modification is made inplace.  The function simply
749 returns the input image again or undef on failure.
750
751 Each channel is mapped independently through a lookup table with 256
752 entries.  The elements in the table should not be less than 0 and not
753 greater than 255.  If they are out of the 0..255 range they are
754 clamped to the range.  If a table does not contain 256 entries it is
755 silently ignored.
756
757 Single channels can mapped by specifying their name and the mapping
758 table.  The channel names are C<red>, C<green>, C<blue>, C<alpha>.
759
760   @map = map { int( $_/2 } 0..255;
761   $img->map( red=>\@map );
762
763 It is also possible to specify a single map that is applied to all
764 channels, alpha channel included.  For example this applies a gamma
765 correction with a gamma of 1.4 to the input image.
766
767   $gamma = 1.4;
768   @map = map { int( 0.5 + 255*($_/255)**$gamma ) } 0..255;
769   $img->map(all=> \@map);
770
771 The C<all> map is used as a default channel, if no other map is
772 specified for a channel then the C<all> map is used instead.  If we
773 had not wanted to apply gamma to the alpha channel we would have used:
774
775   $img->map(all=> \@map, alpha=>[]);
776
777 Since C<[]> contains fewer than 256 element the gamma channel is
778 unaffected.
779
780 It is also possible to simply specify an array of maps that are
781 applied to the images in the rgba order.  For example to apply
782 maps to the C<red> and C<blue> channels one would use:
783
784   $img->map(maps=>[\@redmap, [], \@bluemap]);
785
786 =back
787
788 =head1 SEE ALSO
789
790 L<Imager>, L<Imager::Engines>
791
792 =head1 AUTHOR
793
794 Tony Cook <tony@imager.perl.org>, Arnar M. Hrafnkelsson
795
796 =head1 REVISION
797
798 $Revision$
799
800 =cut