3 Imager::Draw - Draw primitives to images
11 $blue = Imager::Color->new( 0, 0, 255 );
12 $fill = Imager::Fill->new(hatch=>'stipple');
14 $img->line(color=>$blue, x1=>10, x2=>100,
15 y1=>20, y2=>50, aa=>1, endp=>1 );
17 $img->polyline(points=>[[$x0,$y0], [$x1,$y1], [$x2,$y2]],
19 $img->polyline(x=>[$x0,$x1,$x2], y=>[$y0,$y1,$y2], aa=>1);
21 $img->box(color=> $blue, xmin=> 10, ymin=>30,
22 xmax=>200, ymax=>300, filled=>1);
23 $img->box(fill=>$fill);
25 $img->arc(color=>$blue, r=>20, x=>200, y=>100,
28 $img->circle(color=>$blue, r=>50, x=>200, y=>100);
30 $img->polygon(points=>[[$x0,$y0], [$x1,$y1], [$x2,$y2]],
33 $img->polygon(x=>[$x0,$x1,$x2], y=>[$y0,$y1,$y2]);
35 $img->flood_fill(x=>50, y=>50, color=>$color);
37 $img->setpixel(x=>50, y=>70, color=>$color);
39 $img->setpixel(x=>[ 50, 60, 70 ], y=>[20, 30, 40], color=>$color);
41 my $color = $img->getpixel(x=>50, y=>70);
43 my @colors = $img->getpixel(x=>[ 50, 60, 70 ], y=>[20, 30, 40]);
46 my $font = Imager::Font->new(...) or die;
47 $img->string(x => 50, y => 70,
49 string => "Hello, World!",
54 # bottom right-hand corner of the image
55 $img->align_string(x => $img->getwidth() - 1,
56 y => $img->getheight() - 1,
64 my @colors = $img->getscanline(y=>50, x=>10, width=>20);
66 $img->setscanline(y=>60, x=>20, pixels=>\@colors);
68 my @samples = $img->getsamples(y=>50, x=>10, width=>20,
73 It is possible to draw with graphics primitives onto images. Such
74 primitives include boxes, arcs, circles, polygons and lines. The
75 coordinate system in Imager has the origin C<(0,0)> in the upper left
76 corner of an image. For non antialiasing operation all coordinates are
77 rounded towards the nearest integer. For antialiased operations floating
78 point coordinates are used.
80 Drawing is assumed to take place in a coordinate system of infinite
81 resolution. This is the typical convention and really only matters when
82 it is necessary to check for off-by-one cases. Typically it's usefull to
83 think of C<(10, 20)> as C<(10.00, 20.00)> and consider the consiquences.
85 =head2 Color Parameters
87 X<color parameters>The C<color> parameter for any of the drawing
88 methods can be an L<Imager::Color> object, a simple scalar that
89 Imager::Color can understand, a hashref of parameters that
90 Imager::Color->new understands, or an arrayref of red, green, blue
93 $image->box(..., color=>'red');
94 $image->line(..., color=>'#FF0000');
95 $image->flood_fill(..., color=>[ 255, 0, 255 ]);
97 =head2 Fill Parameters
99 X<fill parameters>All filled primitives, i.e. C<arc()>, C<box()>,
100 C<circle()>, C<polygon()> and the C<flood_fill()> method can take a
101 C<fill> parameter instead of a C<color> parameter which can either be
102 an Imager::Fill object, or a reference to a hash containing the
103 parameters used to create the fill, for example:
105 $image->box(..., fill=>{ hatch => 'check1x1' });
106 my $fillimage = Imager->new;
107 $fillimage->read(file=>$somefile) or die;
108 $image->flood_fill(..., fill=>{ image=>$fillimage });
110 Currently you can create opaque or transparent plain color fills,
111 hatched fills, image based fills and fountain fills. See
112 L<Imager::Fill> for more information.
114 =head2 List of primitives
120 $img->line(color=>$green, x1=>10, x2=>100,
121 y1=>20, y2=>50, aa=>1, endp=>1 );
123 X<line method>Draws a line from (x1,y1) to (x2,y2). The endpoint
124 (x2,y2) is drawn by default. If endp of 0 is specified then the
125 endpoint will not be drawn. If C<aa> is set then the line will be
126 drawn antialiased. The I<antialias> parameter is still available for
127 backwards compatibility.
135 x1, y1 - starting point of the line. Required.
139 x2, y2 - end point of the line. Required.
143 color - the color of the line. See L<"Color Parameters">. Default:
148 endp - if zero the end point of the line is not drawn. Default: 1 -
149 the end point is drawn. This is useful to set to 0 when drawning a
150 series of connected lines.
154 aa - if true the line is drawn anti-aliased. Default: 0.
160 $img->polyline(points=>[[$x0,$y0],[$x1,$y1],[$x2,$y2]],color=>$red);
161 $img->polyline(x=>[$x0,$x1,$x2], y=>[$y0,$y1,$y2], aa=>1);
163 X<polyline method>Polyline is used to draw multilple lines between a
164 series of points. The point set can either be specified as an
165 arrayref to an array of array references (where each such array
166 represents a point). The other way is to specify two array
169 The I<antialias> parameter is still available for backwards compatibility.
175 points - a reference to an array of references to arrays containing
176 the co-ordinates of the points in the line, for example:
178 my @points = ( [ 0, 0 ], [ 100, 0 ], [ 100, 100 ], [ 0, 100 ] );
179 $img->polyline(points => \@points);
183 x, y - each is an array of x or y ordinates. This is an alternative
184 to supplying the C<points> parameter.
186 # same as the above points example
187 my @x = ( 0, 100, 100, 0 );
188 my @y = ( 0, 0, 100, 100 );
189 $img->polyline(x => \@x, y => \@y);
193 color - the color of the line. See L<"Color Parameters">. Default:
198 aa - if true the line is drawn anti-aliased. Default: 0. Can also be
199 supplied as C<antialias> for backward compatibility.
205 $blue = Imager::Color->new( 0, 0, 255 );
206 $img->box(color => $blue, xmin=>10, ymin=>30, xmax=>200, ymax=>300,
209 X<box method>If any of the edges of the box are ommited it will snap
210 to the outer edge of the image in that direction. If C<filled> is
211 ommited the box is drawn as an outline. Instead of a color it is
212 possible to use a C<fill> pattern:
214 $fill = Imager::Fill->new(hatch=>'stipple');
215 $img->box(fill=>$fill); # fill entire image with a given fill pattern
217 $img->box(xmin=>10, ymin=>30, xmax=>150, ymax=>60,
218 fill => { hatch=>'cross2' });
220 Also if a color is omitted a color with (255,255,255,255) is used
221 instead. [NOTE: This may change to use C<$img-E<gt>fgcolor()> in the future].
223 Box does not support fractional coordinates yet.
231 xmin - left side of the box. Default: 0 (left edge of the image)
235 ymin - top side of the box. Default: 0 (top edge of the image)
239 xmax - right side of the box. Default: $img->getwidth-1. (right edge
244 ymax - bottom side of the box. Default: $img->getheight-1. (bottom
247 Note: xmax and ymax are I<inclusive> - the number of pixels drawn for
248 a filled box is (xmax-xmin+1) * (ymax-ymin+1).
252 box - a reference to an array of (left, top, right, bottom)
253 co-ordinates. This is an alternative to supplying xmin, ymin, xmax,
254 ymax and overrides their values.
258 color - the color of the line. See L<"Color Parameters">. Default:
259 white. This is ignored if the filled parameter
263 filled - if non-zero the box is filled with I<color> instead of
264 outlined. Default: an outline is drawn.
268 fill - the fill for the box. If this is supplied then the box will be
269 filled. See L<"Fill Parameters">.
275 $img->arc(color=>$red, r=>20, x=>200, y=>100, d1=>10, d2=>20 );
277 This creates a filled red arc with a 'center' at (200, 100) and spans
278 10 degrees and the slice has a radius of 20. [NOTE: arc has a BUG in
279 it right now for large differences in angles.]
280 It's also possible to supply a C<fill> parameter.
288 x, y - center of the filled arc. Default: center of the image.
292 r - radius of the arc. Default: 1/3 of min(image height, image width).
296 d1 - starting angle of the arc, in degrees. Default: 0
300 d2 - ending angle of the arc, in degrees. Default: 361.
304 color - the color of the filled arc. See L<"Color Parameters">.
305 Default: white. Overridden by C<fill>.
309 fill - the fill for the filled arc. See L<"Fill Parameters">
313 aa - if true the filled arc is drawn anti-aliased. Default: false.
315 Anti-aliased arc() is experimental for now, I'm not entirely happy
316 with the results in some cases.
320 # arc going through angle zero:
321 $img->arc(d1=>320, d2=>40, x=>100, y=>100, r=>50, color=>'blue');
324 $img->arc(d1=>135, d2=>45, x=>100, y=>150, r=>50,
325 fill=>{ solid=>'red', combine=>'diff' });
329 $img->circle(color=>$green, r=>50, x=>200, y=>100, aa=>1, filled=>1);
331 This creates an antialiased green circle with its center at (200, 100)
332 and has a radius of 50. It's also possible to supply a C<fill> parameter
333 instead of a color parameter.
335 $img->circle(r => 50, x=> 150, y => 150, fill=>{ hatch => 'stipple' });
337 The circle is always filled but that might change, so always pass a
338 filled=>1 parameter if you want it to be filled.
344 x, y - center of the filled circle. Default: center of the image.
348 r - radius of the circle. Default: 1/3 of min(image height, image width).
352 color - the color of the filled circle. See L<"Color Parameters">.
353 Default: white. Overridden by C<fill>.
357 fill - the fill for the filled circle. See L<"Fill Parameters">
361 aa - if true the filled circle is drawn anti-aliased. Default: false.
367 $img->polygon(points=>[[$x0,$y0],[$x1,$y1],[$x2,$y2]],color=>$red);
368 $img->polygon(x=>[$x0,$x1,$x2], y=>[$y0,$y1,$y2], fill=>$fill);
370 Polygon is used to draw a filled polygon. Currently the polygon is
371 always drawn antialiased, although that will change in the future.
372 Like other antialiased drawing functions its coordinates can be
373 specified with floating point values. As with other filled shapes
374 it's possible to use a C<fill> instead of a color.
380 points - a reference to an array of references to arrays containing
381 the co-ordinates of the points in the line, for example:
383 my @points = ( [ 0, 0 ], [ 100, 0 ], [ 100, 100 ], [ 0, 100 ] );
384 $img->polygon(points => \@points);
388 x, y - each is an array of x or y ordinates. This is an alternative
389 to supplying the C<points> parameter.
391 # same as the above points example
392 my @x = ( 0, 100, 100, 0 );
393 my @y = ( 0, 0, 100, 100 );
394 $img->polygon(x => \@x, y => \@y);
398 color - the color of the filled polygon. See L<"Color Parameters">.
399 Default: black. Overridden by C<fill>.
403 fill - the fill for the filled circle. See L<"Fill Parameters">
409 You can fill a region that all has the same color using the
410 flood_fill() method, for example:
412 $img->flood_fill(x=>50, y=>50, color=>$color);
414 will fill all regions the same color connected to the point (50, 50).
416 You can also fill with a complex fill:
418 $img->flood_fill(x=>50, y=>50, fill=>{ hatch=>'cross1x1' });
426 x, y - the start point of the fill.
430 color - the color of the filled area. See L<"Color Parameters">.
431 Default: white. Overridden by C<fill>.
435 fill - the fill for the filled area. See L<"Fill Parameters">
441 $img->setpixel(x=>50, y=>70, color=>$color);
442 $img->setpixel(x=>[ 50, 60, 70 ], y=>[20, 30, 40], color=>$color);
444 setpixel() is used to set one or more individual pixels.
452 x, y - either integers giving the co-ordinates of the pixel to set or
453 array references containing a set of pixels to be set.
457 color - the color of the pixels drawn. See L<"Color Parameters">.
464 my $color = $img->getpixel(x=>50, y=>70);
465 my @colors = $img->getpixel(x=>[ 50, 60, 70 ], y=>[20, 30, 40]);
466 my $colors_ref = $img->getpixel(x=>[ 50, 60, 70 ], y=>[20, 30, 40]);
468 getpixel() is used to retrieve one or more individual pixels.
470 For either method you can supply a single set of co-ordinates as
471 scalar x and y parameters, or set each to an arrayref of ordinates.
473 When called with arrays, getpixel() will return a list of colors in
474 list context, and an arrayref in scalar context.
476 To receive floating point colors from getpixel, set the C<type>
477 parameter to 'float'.
485 x, y - either integers giving the co-ordinates of the pixel to set or
486 array references containing a set of pixels to be set.
490 type - the type of color object to return, either C<'8bit'> for
491 Imager::Color objects or C<'float'> for Imager::Color::Float objects.
498 my $font = Imager::Font->new(file=>"foo.ttf");
499 $img->string(x => 50, y => 70,
500 string => "Hello, World!",
506 Draws text on the image.
514 x, y - the point to draw the text from. If C<align> is 0 this is the
515 top left of the string. If C<align> is 1 (the default) then this is
516 the left of the string on the baseline. Required.
520 string - the text to draw. Required unless you supply the C<text>
525 font - an L<Imager::Font> object representing the font to draw the
530 aa - if non-zero the output will be anti-aliased. Default: the value
531 set in Imager::Font->new() or 0 if not set.
535 align - if non-zero the point supplied in (x,y) will be on the
536 base-line, if zero then (x,y) will be at the top-left of the string.
538 ie. if drawing the string "yA" and align is 0 the point (x,y) will
539 aligned with the top of the A. If align is 1 (the default) it will be
540 aligned with the baseline of the font, typically bottom of the A,
541 depending on the font used.
543 Default: the value set in Imager::Font->new, or 1 if not set.
547 channel - if present, the text will be written to the specified
548 channel of the image and the color parameter will be ignore.
552 color - the color to draw the text in. Default: the color supplied to
553 Imager::Font->new, or red if none.
557 size - the point size to draw the text at. Default: the size supplied
558 to Imager::Font->new, or 15.
562 sizew - the width scaling to draw the text at. Default: the value of
567 utf8 - for drivers that support it, treat the string as UTF8 encoded.
568 For versions of perl that support Unicode (5.6 and later), this will
569 be enabled automatically if the C<string> parameter is already a UTF8
570 string. See L<Imager::Font/"UTF8"> for more information.
574 vlayout - for drivers that support it, draw the text vertically.
575 Note: I haven't found a font that has the appropriate metrics yet.
579 text - alias for the C<string> parameter.
583 On error, string() returns false and you can use $img->errstr to get
584 the reason for the error.
588 Draws text aligned around a point on the image.
590 # "Hello" centered at 100, 100 in the image.
591 my ($left, $top, $right, $bottom) =
592 $img->align_string(string=>"Hello",
594 halign=>'center', valign=>'center',
603 x, y - the point to draw the text from. If C<align> is 0 this is the
604 top left of the string. If C<align> is 1 (the default) then this is
605 the left of the string on the baseline. Required.
609 string - the text to draw. Required unless you supply the C<text> parameter.
613 font - an L<Imager::Font> object representing the font to draw the
618 aa - if non-zero the output will be anti-aliased
622 valign - vertical alignment of the text against (x,y)
628 top - Point is at the top of the text.
632 bottom - Point is at the bottom of the text.
636 baseline - Point is on the baseline of the text. This is the default.
640 center - Point is vertically centered within the text.
646 halign - horizontal alignment of the text against (x,y)
652 left - The point is at the left of the text. This is the default.
656 start - The point is at the start point of the text.
660 center - The point is horizontally centered within the text.
664 right - The point is at the right end of the text.
668 end - The point is at the end point of the text.
674 channel - if present, the text will be written to the specified
675 channel of the image and the color parameter will be ignore.
679 color - the color to draw the text in. Default: the color supplied to
680 Imager::Font->new, or red if none.
684 size - the point size to draw the text at. Default: the size supplied
685 to Imager::Font->new, or 15.
689 sizew - the width scaling to draw the text at. Default: the value of
694 utf8 - for drivers that support it, treat the string as UTF8 encoded.
695 For versions of perl that support Unicode (5.6 and later), this will
696 be enabled automatically if the C<string> parameter is already a UTF8
697 string. See L<Imager::Font/"UTF8"> for more information.
701 vlayout - for drivers that support it, draw the text vertically.
702 Note: I haven't found a font that has the appropriate metrics yet.
706 text - alias for the C<string> parameter.
710 On success returns a list of bounds of the drawn text, in the order
711 left, top, right, bottom.
713 On error, align_string() returns an empty list and you can use
714 $img->errstr to get the reason for the error.
718 Set all or part of a horizontal line of pixels to an image. This
719 method is most useful in conjuction with L</getscanline>.
721 The parameters you can pass are:
727 y - vertical position of the scanline. This parameter is required.
731 x - position to start on the scanline. Default: 0
735 pixels - either a reference to an array containing Imager::Color
736 objects, an reference to an array containing Imager::Color::Float
737 objects or a scalar containing packed color data.
739 See L</"Packed Color Data"> for information on the format of packed
744 type - the type of pixel data supplied. If you supply an array
745 reference of object then this is determined automatically. If you
746 supply packed color data this defaults to '8bit', if your data is
747 packed floating point color data then set this to 'float'.
749 You can use float or 8bit samples with any image.
753 Returns the number of pixels set.
755 Each of the following sets 5 pixels from (5, 10) through (9, 10) to
756 blue, red, blue, red, blue:
758 my $red_color = Imager::Color->new(255, 0, 0);
759 my $blue_color = Imager::Color->new(0, 0, 255);
761 $image->setscanline(y=>10, x=>5, pixels=>
762 [ ($blue_color, $red_color) x 2, $blue_color ]);
764 # use floating point color instead, for 16-bit plus images
765 my $red_colorf = Imager::Color::Float->new(1.0, 0, 0);
766 my $blue_colorf = Imager::Color::Float->new(0, 0, 1.0);
768 $image->setscanline(y=>10, x=>5, pixels=>
769 [ ($blue_colorf, $red_colorf) x 2, $blue_colorf ]);
772 $image->setscanline(y=>10, x=>5, pixels=>
773 pack("C*", ((0, 0, 255, 255), (255, 0, 0, 255)) x 2,
776 # packed floating point samples
777 $image->setscanline(y=>10, x=>5, type=>'float', pixels=>
778 pack("d*", ((0, 0, 1.0, 1.0), (1.0, 0, 0, 1.0)) x 2,
782 Copy even rows from one image to another:
784 for (my $y = 0; $y < $im2->getheight; $y+=2) {
785 $im1->setscanline(y=>$y,
786 pixels=>scalar($im2->getscanline(y=>$y)));
790 Set the blue channel to 0 for all pixels in an image. This could be
791 done with convert too:
793 for my $y (0..$im->getheight-1) {
794 my $row = $im->getscanline(y=>$y);
795 $row =~ s/(..).(.)/$1\0$2/gs;
796 $im->setscanline(y=>$y, pixels=>$row);
801 Read all or part of a horizonatal line of pixels from an image. This
802 method is most useful in conjunction with L</setscanline>.
804 The parameters you can pass are:
810 y - vertical position of the scanline. This parameter is required.
814 x - position to start on the scanline. Default: 0
818 width - number of pixels to read. Default: $img->getwidth - x
822 type - the type of pixel data to return. Default: C<8bit>.
824 Permited values are C<8bit> and C<float>.
828 In list context this method will return a list of Imager::Color
829 objects when I<type> is C<8bit>, or a list of Imager::Color::Float
830 objects when I<type> if C<float>.
832 In scalar context this returns a packed 8-bit pixels when I<type> is
833 C<8bit>, or a list of packed floating point pixels when I<type> is
836 The values of samples for which the image does not have channels is
837 undefined. For example, for a single channel image the values of
838 channels 1 through 3 are undefined.
840 Check image for a given color:
843 YLOOP: for my $y (0..$img->getheight-1) {
844 my @colors = $img->getscanline(y=>$y);
845 for my $color (@colors) {
846 my ($red, $green, $blue, $alpha) = $color->rgba;
847 if ($red == $test_red && $green == $test_green && $blue == $test_blue
848 && $alpha == $test_alpha) {
855 Or do it using packed data:
858 my $test_packed = pack("CCCC", $test_red, $test_green, $test_blue,
860 YLOOP: for my $y (0..$img->getheight-1) {
861 my $colors = $img->getscanline(y=>$y);
862 while (length $colors) {
863 if (substr($colors, 0, 4, '') eq $test_packed) {
870 Some of the examples for L</setscanline> for more examples.
874 Read specified channels from all or part of a horizontal line of
875 pixels from an image.
877 The parameters you can pass are:
883 y - vertical position of the scanline. This parameter is required.
887 x - position to start on the scanline. Default: 0
891 width - number of pixels to read. Default: $img->getwidth - x
895 type - the type of sample data to return. Default: C<8bit>.
897 Permited values are C<8bit> and C<float>.
901 channels - a reference to an array of channels to return, where 0 is
902 the first channel. Default: C< [ 0 .. $self->getchannels()-1 ] >
906 In list context this will return a list of integers between 0 and 255
907 inclusive when I<type> is C<8bit>, or a list of floating point numbers
908 between 0.0 and 1.0 inclusive when I<type> is C<float>.
910 In scalar context this will return a string of packed bytes, as with
911 C< pack("C*", ...) > when I<type> is C<8bit> or a string of packed
912 doubles as with C< pack("d*", ...) > when I<type> is C<float>.
914 Example: Check if any pixels in an image have a non-zero alpha
918 for my $y (0 .. $img->getheight()-1) {
919 my $alpha = $img->getsamples(y=>$y, channels=>[0]);
920 if ($alpha =~ /[^\0]/) {
926 Example: Convert a 2 channel grey image into a 4 channel RGBA image:
928 # this could be done with convert() instead
929 my $out = Imager->new(xsize => $src->getwidth(),
930 ysize => $src->getheight(),
932 for my $y ( 0 .. $src->getheight()-1 ) {
933 my $data = $src->getsamples(y=>$y, channels=>[ 0, 0, 0, 1 ]);
934 $out->setscanline(y=>$y, pixels=>$data);
939 =head1 Packed Color Data
941 The getscanline() and setscanline() functions can work with pixels
942 packed into scalars. This is useful to remove the cost of creating
943 color objects, but should only be used when performance is an issue.
945 Packed data can either be 1 byte per sample or 1 double per sample.
947 Each pixel returned by getscanline() or supplied to setscanline()
948 contains 4 samples, even if the image has fewer then 4 channels. The
949 values of the extra samples as returned by getscanline() is not
950 specified. The extra samples passed to setscanline() are ignored.
952 To produce packed 1 byte/sample pixels, use the pack C<C> template:
954 my $packed_8bit_pixel = pack("CCCC", $red, $blue, $green, $alpha);
956 To produce packed double/sample pixels, use the pack C<d> template:
958 my $packed_float_pixel = pack("dddd", $red, $blue, $green, $alpha);
962 box, arc, do not support antialiasing yet. Arc, is only filled as of
963 yet. Default color is not unified yet.
967 Tony Cook <tony@imager.perl.org>, Arnar M. Hrafnkelsson.
971 L<Imager>(3), L<Imager::Cookbook>(3)