3 Imager::Filters - Entire Image Filtering Operations
11 $img->filter(type=>'autolevels');
12 $img->filter(type=>'autolevels', lsat=>0.2);
13 $img->filter(type=>'turbnoise')
17 load_plugin("dynfilt/dyntest.so")
18 or die "unable to load plugin\n";
20 $img->filter(type=>'lin_stretch', a=>35, b=>200);
22 unload_plugin("dynfilt/dyntest.so")
23 or die "unable to load plugin\n";
25 $out = $img->difference(other=>$other_img);
29 Filters are operations that have similar calling interface.
41 type - the type of filter, see L</Types of Filters>.
45 many other possible parameters, see L</Types of Filters> below.
51 =head2 Types of Filters
53 Here is a list of the filters that are always available in Imager.
54 This list can be obtained by running the C<filterlist.perl> script
55 that comes with the module source.
57 Filter Arguments Default value
62 bumpmap bump lightx lighty
117 unsharpmask stddev 2.0
125 All parameters must have some value but if a parameter has a default
126 value it may be omitted when calling the filter function.
128 Every one of these filters modifies the image in place.
130 If none of the filters here do what you need, the
131 L<Imager::Engines/transform()> or L<Imager::Engines/transform2()>
132 function may be useful.
135 autolevels bumpmap bumpmap_complex conv gaussian hardinvert hardinvertall
136 radnoise turbnoise unsharpmask gradgen postlevels
138 A reference of the filters follows:
144 scales the value of each channel so that the values in the image will
145 cover the whole possible range for the channel. C<lsat> and C<usat>
146 truncate the range by the specified fraction at the top and bottom of
147 the range respectively.
149 # increase contrast per channel, losing little detail
150 $img->filter(type=>"autolevels")
153 # increase contrast, losing 20% of highlight at top and bottom range
154 $img->filter(type=>"autolevels", lsat=>0.2, usat=>0.2)
159 uses the channel C<elevation> image C<bump> as a bump map on your
160 image, with the light at (C<lightx>, C<lightty>), with a shadow length
163 $img->filter(type=>"bumpmap", bump=>$bumpmap_img,
164 lightx=>10, lighty=>10, st=>5)
167 =item bumpmap_complex
169 uses the channel C<channel> image C<bump> as a bump map on your image.
170 If C<< Lz < 0 >> the three L parameters are considered to be the
171 direction of the light. If C<< Lz > 0 >> the L parameters are
172 considered to be the light position. C<Ia> is the ambient color,
173 C<Il> is the light color, C<Is> is the color of specular highlights.
174 C<cd> is the diffuse coefficient and C<cs> is the specular
175 coefficient. C<n> is the shininess of the surface.
177 $img->filter(type=>"bumpmap_complex", bump=>$bumpmap_img)
182 scales each channel by C<intensity>. Values of C<intensity> < 1.0
183 will reduce the contrast.
186 $img->filter(type=>"contrast", intensity=>1.3)
190 $img->filter(type=>"contrast", intensity=>0.8)
195 performs 2 1-dimensional convolutions on the image using the values
196 from C<coef>. C<coef> should be have an odd length and the sum of the
197 coefficients must be non-zero.
200 $img->filter(type=>"conv", coef=>[-0.5, 2, -0.5 ])
204 $img->filter(type=>"conv", coef=>[ 1, 2, 1 ])
208 $img->filter(type=>"conv", coef=>[ -0.5, 1, -0.5 ])
213 renders a fountain fill, similar to the gradient tool in most paint
214 software. The default fill is a linear fill from opaque black to
215 opaque white. The points C<A(Cxa, ya)> and C<B(xb, yb)> control the
216 way the fill is performed, depending on the C<ftype> parameter:
218 =for stopwords ramping
224 the fill ramps from A through to B.
228 the fill ramps in both directions from A, where AB defines the length
233 A is the center of a circle, and B is a point on it's circumference.
234 The fill ramps from the center out to the circumference.
236 =item C<radial_square>
238 A is the center of a square and B is the center of one of it's sides.
239 This can be used to rotate the square. The fill ramps out to the
244 A is the center of a circle and B is a point on its circumference. B
245 marks the 0 and 360 point on the circle, with the fill ramping
250 A is the center of a circle and B is a point on it's circumference. B
251 marks the 0 and point on the circle, with the fill ramping in both
252 directions to meet opposite.
256 The C<repeat> option controls how the fill is repeated for some
257 C<ftype>s after it leaves the AB range:
263 no repeats, points outside of each range are treated as if they were
264 on the extreme end of that range.
268 the fill simply repeats in the positive direction
272 the fill repeats in reverse and then forward and so on, in the
277 the fill repeats in both the positive and negative directions (only
278 meaningful for a linear fill).
282 as for triangle, but in the negative direction too (only meaningful
287 By default the fill simply overwrites the whole image (unless you have
288 parts of the range 0 through 1 that aren't covered by a segment), if
289 any segments of your fill have any transparency, you can set the
290 I<combine> option to 'normal' to have the fill combined with the
291 existing pixels. See the description of I<combine> in L<Imager::Fill>.
293 If your fill has sharp edges, for example between steps if you use
294 repeat set to 'triangle', you may see some aliased or ragged edges.
295 You can enable super-sampling which will take extra samples within the
296 pixel in an attempt anti-alias the fill.
298 The possible values for the super_sample option are:
304 no super-sampling is done
308 a square grid of points are sampled. The number of points sampled is
309 the square of ceil(0.5 + sqrt(ssample_param)).
313 a random set of points within the pixel are sampled. This looks
314 pretty bad for low ssample_param values.
318 the points on the radius of a circle within the pixel are sampled.
319 This seems to produce the best results, but is fairly slow (for now).
323 You can control the level of sampling by setting the ssample_param
324 option. This is roughly the number of points sampled, but depends on
325 the type of sampling.
327 The segments option is an arrayref of segments. You really should use
328 the L<Imager::Fountain> class to build your fountain fill. Each
329 segment is an array ref containing:
335 a floating point number between 0 and 1, the start of the range of
336 fill parameters covered by this segment.
340 a floating point number between start and end which can be used to
341 push the color range towards one end of the segment.
345 a floating point number between 0 and 1, the end of the range of fill
346 parameters covered by this segment. This should be greater than
353 The colors at each end of the segment. These can be either
354 Imager::Color or Imager::Color::Float objects.
358 The type of segment, this controls the way the fill parameter varies
359 over the segment. 0 for linear, 1 for curved (unimplemented), 2 for
360 sine, 3 for sphere increasing, 4 for sphere decreasing.
364 The way the color varies within the segment, 0 for simple RGB, 1 for
365 hue increasing and 2 for hue decreasing.
369 Don't forget to use Imager::Fountain instead of building your own.
370 Really. It even loads GIMP gradient files.
372 # build the gradient the hard way - linear from black to white,
376 [ 0, 0.25, 0.5, 'black', 'white', 0, 0 ],
377 [ 0.5. 0.75, 1.0, 'white', 'black', 0, 0 ],
380 my $linear = $img->copy;
381 $linear->filter(type => "fountain",
383 repeat => 'sawtooth',
384 segments => \@simple,
386 ya => $linear->getheight / 2,
387 xb => $linear->getwidth - 1,
388 yb => $linear->getheight / 2)
389 or die $linear->errstr;
391 my $revolution = $img->copy;
392 $revolution->filter(type => "fountain",
393 ftype => 'revolution',
394 segments => \@simple,
395 xa => $revolution->getwidth / 2,
396 ya => $revolution->getheight / 2,
397 xb => $revolution->getwidth / 2,
399 or die $revolution->errstr;
400 # out from the middle
401 my $radial = $img->copy;
402 $radial->filter(type => "fountain",
404 segments => \@simple,
405 xa => $im->getwidth / 2,
406 ya => $im->getheight / 2,
407 xb => $im->getwidth / 2,
409 or die $radial->errstr;
411 =for stopwords Gaussian
415 performs a Gaussian blur of the image, using C<stddev> as the standard
416 deviation of the curve used to combine pixels, larger values give
417 bigger blurs. For a definition of Gaussian Blur, see:
419 http://www.maths.abdn.ac.uk/~igc/tch/mx4002/notes/node99.html
421 Values of C<stddev> around 0.5 provide a barely noticeable blur,
422 values around 5 provide a very strong blur.
424 # only slightly blurred
425 $img->filter(type=>"gaussian", stddev=>0.5)
428 # more strongly blurred
429 $img->filter(type=>"gaussian", stddev=>5)
434 renders a gradient, with the given I<colors> at the corresponding
435 points (x,y) in C<xo> and C<yo>. You can specify the way distance is
436 measured for color blending by setting C<dist> to 0 for Euclidean, 1
437 for Euclidean squared, and 2 for Manhattan distance.
439 $img->filter(type="gradgen",
442 colors=>[ qw(red blue green) ]);
445 X<filters, hardinvert>X<hardinvert>
447 inverts the image, black to white, white to black. All color channels
448 are inverted, excluding the alpha channel if any.
450 $img->filter(type=>"hardinvert")
454 X<filters, hardinvertall>X<hardinvertall>
456 inverts the image, black to white, white to black. All channels are
457 inverted, including the alpha channel if any.
459 $img->filter(type=>"hardinvertall")
464 produces averaged tiles of the given C<size>.
466 $img->filter(type=>"mosaic", size=>5)
471 adds noise of the given C<amount> to the image. If C<subtype> is
472 zero, the noise is even to each channel, otherwise noise is added to
473 each channel independently.
476 $img->filter(type=>"noise", amount=>20, subtype=>0)
480 $img->filter(type=>"noise", amount=>20, subtype=>1)
483 =for stopwords Perlin
487 renders radiant Perlin turbulent noise. The center of the noise is at
488 (C<xo>, C<yo>), C<ascale> controls the angular scale of the noise ,
489 and C<rscale> the radial scale, higher numbers give more detail.
491 $img->filter(type=>"radnoise", xo=>50, yo=>50,
492 ascale=>1, rscale=>0.02)
497 alters the image to have only C<levels> distinct level in each
500 $img->filter(type=>"postlevels", levels=>10)
505 renders Perlin turbulent noise. (C<xo>, C<yo>) controls the origin of
506 the noise, and C<scale> the scale of the noise, with lower numbers
509 $img->filter(type=>"turbnoise", xo=>10, yo=>10, scale=>10)
512 =for stopwords unsharp
516 performs an unsharp mask on the image. This increases the contrast of
519 This is the result of subtracting a Gaussian blurred version of the
520 image from the original. C<stddev> controls the C<stddev> parameter
521 of the Gaussian blur. Each output pixel is:
523 in + scale * (in - blurred)
527 $img->filter(type=>"unsharpmask", stddev=>1, scale=>0.5)
530 C<unsharpmark> has the following parameters:
532 =for stopwords GIMP GIMP's
538 C<stddev> - this is equivalent to the C<Radius> value in the GIMP's
539 unsharp mask filter. This controls the size of the contrast increase
540 around edges, larger values will remove fine detail. You should
541 probably experiment on the types of images you plan to work with.
546 C<scale> - controls the strength of the edge enhancement, equivalent
547 to I<Amount> in the GIMP's unsharp mask filter. Default: 1.0.
553 applies C<wmark> as a watermark on the image with strength C<pixdiff>,
554 with an origin at (C<tx>, C<ty>)
556 $img->filter(type=>"watermark", tx=>10, ty=>50,
557 wmark=>$wmark_image, pixdiff=>50)
562 A demonstration of most of the filters can be found at:
564 http://www.develop-help.com/imager/filters.html
566 =head2 External Filters
568 As of Imager 0.48 you can create perl or XS based filters and hook
569 them into Imager's filter() method:
573 =item register_filter()
575 Registers a filter so it is visible via Imager's filter() method.
577 Imager->register_filter(type => 'your_filter',
578 defaults => { parm1 => 'default1' },
579 callseq => [ qw/image parm1/ ],
580 callsub => \&your_filter);
581 $img->filter(type=>'your_filter', parm1 => 'something');
583 The following parameters are needed:
589 C<type> - the type value that will be supplied to filter() to use your
594 C<defaults> - a hash of defaults for the filter's parameters
598 C<callseq> - a reference to an array of required parameter names.
602 C<callsub> - a code reference called to execute your filter. The
603 parameters passed to filter() are supplied as a list of parameter
604 name, value ... which can be assigned to a hash.
606 The special parameters C<image> and C<imager> are supplied as the low
607 level image object from $self and $self itself respectively.
609 The function you supply must modify the image in place.
613 See L<Imager::Filter::Mandelbrot> for an example.
621 The plug in interface is deprecated. Please use the Imager API, see
622 L<Imager::API> and L</External Filters> for details
624 It is possible to add filters to the module without recompiling Imager
625 itself. This is done by using DSOs (Dynamic shared object) available
626 on most systems. This way you can maintain your own filters and not
627 have to have it added to Imager, or worse patch every new version of
628 Imager. Modules can be loaded AND UNLOADED at run time. This means
629 that you can have a server/daemon thingy that can do something like:
631 load_plugin("dynfilt/dyntest.so")
632 or die "unable to load plugin\n";
634 $img->filter(type=>'lin_stretch', a=>35, b=>200);
636 unload_plugin("dynfilt/dyntest.so")
637 or die "unable to load plugin\n";
639 Someone decides that the filter is not working as it should -
640 F<dyntest.c> can be modified and recompiled, and then reloaded:
642 load_plugin("dynfilt/dyntest.so")
643 or die "unable to load plugin\n";
647 =for stopwords Linux Solaris HPUX OpenBSD FreeBSD TRU64 OSF1 AIX Win32 OS X
649 Note: This has been tested successfully on the following systems:
650 Linux, Solaris, HPUX, OpenBSD, FreeBSD, TRU64/OSF1, AIX, Win32, OS X.
656 This is a function, not a method, exported by default. You should
657 import this function explicitly for future compatibility if you need
660 Accepts a single parameter, the name of a shared library file to load.
662 Returns true on success. Check Imager->errstr on failure.
664 =item unload_plugin()
666 This is a function, not a method, which is exported by default. You
667 should import this function explicitly for future compatibility if you
670 Accepts a single parameter, the name of a shared library to unload.
671 This library must have been previously loaded by load_plugin().
673 Returns true on success. Check Imager->errstr on failure.
677 A few example plug-ins are included and built (but not installed):
683 F<plugins/dyntest.c> - provides the C<null> (no action) filter, and
684 C<lin_stretch> filters. C<lin_stretch> stretches sample values
685 between C<a> and C<b> out to the full sample range.
689 F<plugins/dt2.c> - provides the C<html_art> filter that writes the
690 image to the HTML fragment file supplied in C<fname> as a HTML table.
694 F<plugins/flines.c> - provides the C<flines> filter that dims
695 alternate lines to emulate an old CRT display.
696 L<Imager::Filter::Flines> provides the same functionality.
700 F<plugins/mandelbrot.c> - provides the C<mandelbrot> filter that
701 renders the Mandelbrot set within the given range of x [-2, 0.5) and y
702 [-1.25, 1,25). L<Imager::Filter::Mandelbrot> provides a more flexible
703 Mandelbrot set renderer.
707 =head2 Image Difference
713 You can create a new image that is the difference between 2 other images.
715 my $diff = $img->difference(other=>$other_img);
717 For each pixel in $img that is different to the pixel in $other_img,
718 the pixel from $other_img is given, otherwise the pixel is transparent
721 This can be used for debugging image differences ("Where are they
722 different?"), and for optimizing animated GIFs.
724 Note that $img and $other_img must have the same number of channels.
725 The width and height of $diff will be the minimum of each of the width
726 and height of $img and $other_img.
734 C<other> - the other image object to compare against
738 C<mindist> - the difference between corresponding samples must be
739 greater than C<mindist> for the pixel to be considered different. So
740 a value of zero returns all different pixels, not all pixels. Range:
741 0 to 255 inclusive. Default: 0.
743 For large sample images this is scaled down to the range 0 .. 1.
751 Arnar M. Hrafnkelsson, Tony Cook <tony@imager.perl.org>.
755 Imager, Imager::Filter::Flines, Imager::Filter::Mandelbrot