3 Imager::Cookbook - recipes working with Imager
7 Various simple and not so simple ways to do things with Imager.
11 This is described in detail in L<Imager::Files>.
13 =head2 Reading an image from a file
15 my $image = Imager->new;
17 $image->read(file=>$filename) or die $image->errstr;
21 =head2 Writing an image to a file
23 $image->write(file=>$filename) or die $image->errstr;
25 =head2 Write an animated gif.
27 # build an array of images to use in the gif
29 # synthesize the images or read them from files, it doesn't matter
33 Imager->write_multi({ file=>$filename, type=>'gif' }, @images)
34 or die Imager->errstr;
36 See L<Imager::Files/"Writing an animated GIF"> for a more detailed
39 =head2 Reading multiple images from one file
41 Some formats, like GIF and TIFF support multiple images per file. Use
42 the L<read_multi()|Imager::Files> method to read them:
44 my @images = Imager->read_multi(file=>$filename)
45 or die Imager->errstr;
47 =head1 IMAGE SYNTHESIS
49 =head2 Creating an image
51 To create a simple RGB image, supply the image width and height to the
54 my $rgb = Imager->new(xsize=>$width, ysize=>$height);
56 If you also want an alpha channel:
58 my $rgb_alpha = Imager->new(xsize=>$width, ysize=>$height, channels=>4);
60 To make a grayscale image:
62 my $gray = Imager->new(xsize=>$width, ysize=>$height, channels=>1);
64 and a grayscale image with an alpha channel:
66 my $gray_alpha = Imager->new(xsize=>$width, ysize=>$height, channels=>2);
68 When a new image is created this way all samples are set to zero -
69 black for 1 or 3 channel images, transparent black for 2 or 4 channel
72 You can also create paletted images and images with more than 8-bits
73 per channel, see L<Imager::ImageTypes> for more details.
75 =head2 Setting the background of a new image
77 To set the background of a new image to a solid color, use the box()
78 method with no limits, and C<< filled=>1 >>:
80 $image->box(filled=>1, color=>$color);
82 As always, a color can be specified as an L<Imager::Color> object:
84 my $white = Imager::Color->new(255, 255, 255);
85 $image->box(filled=>1, color=>$white);
87 or you supply any single scalar that Imager::Color's new() method
88 accepts as a color description:
90 $image->box(filled=>1, color=>'white');
91 $image->box(filled=>1, color=>'#FF0000');
92 $image->box(filled=>1, color=>[ 255, 255, 255 ]);
94 You can also fill the image with a fill object:
97 # create the fill object
98 my $fill = Imager::Fill->new(hatch=>'check1x1')
99 $image->box(fill=>$fill);
101 # let Imager create one automatically
102 $image->box(fill=>{ hatch=>'check1x1' });
104 See L<Imager::Fill> for information on Imager's fill objects.
106 =head1 WORLD WIDE WEB
108 As with any CGI script it's up to you to validate data and set limits
109 on any parameters supplied to Imager.
111 For example, if you allow the caller to set the size of an output
112 image you should limit the size to prevent the client from specifying
113 an image size that will consume all available memory.
115 This is beside any any other controls you need over access to data.
117 See L<CGI> for a module useful for processing CGI submitted data.
119 =head2 Returning an image from a CGI script
121 This is similar to writing to a file, but you also need to supply the
122 information needed by the web browser to identify the file format:
124 my $img = ....; # create the image and generate the contents
125 ++$|; # make sure the content type isn't buffered
126 print "Content-Type: image/png\n\n";
128 $img->write(fd=>fileno(STDOUT), type=>'png')
131 You need to set the Content-Type header depending on the file format
132 you send to the web browser.
134 If you want to supply a content-length header, write the image to a
137 my $img = ....; # create the image and generate the contents
139 $img->write(type=>'png', data=>\$data)
141 print "Content-Type: image/png\n";
142 print "Content-Length: ",length($data),"\n\n";
146 See C<samples/samp-scale.cgi> and C<samples/samp-image.cgi> for a
147 couple of simple examples of producing an image from CGI.
149 =head2 Inserting a CGI image in a page
151 There's occasionally confusion on how to display an image generated by
152 Imager in a page generated by a CGI.
154 Your web browser handles this process as two requests, one for the
155 HTML page, and another for the image itself.
157 Each request needs to perform validation since an attacker can control
158 the values supplied to both requests.
160 How you make the data available to the image generation code depends
163 See C<samples/samp-form.cgi> and C<samples/samp-image.cgi> in the
164 Imager distribution for one approach. The POD in C<samp-form.cgi>
165 also discusses some of the issues involved.
167 =head2 Parsing an image posted via CGI
169 C<WARNING>: file format attacks have become a common attack vector,
170 make sure you have up to date image file format libraries, otherwise
171 trying to parse uploaded files, whether with Imager or some other
172 tool, may result in a remote attacker being able to run their own code
173 on your system. Currently Imager makes no attempt to place size
174 limits on a read image file. This may result in consumption of large
175 amounts of memory. Future versions of Imager may provide mechanisms
176 to limit the sizes of images read from files.
178 If your HTML form uses the correct magic, it can upload files to your
179 CGI script, in particular, you need to use C< method="post" > and
180 C<enctype="multipart/form-data"> in the C<form> tag, and use
181 C<type="file"> in the C<input>, for example:
183 <form action="/cgi-bin/yourprogram" method="post"
184 enctype="multipart/form-data">
185 <input type="file" name="myimage" />
186 <input type="submit value="Upload Image" />
195 first check that the user supplied a file
203 have Imager read the image
207 # returns the client's name for the file, don't open this locally
209 # 1. check the user supplied a file
210 my $filename = $cgi->param('myimage');
212 # 2. get the file handle
213 my $fh = $cgi->upload('myimage');
217 # 3. have Imager read the image
218 my $img = Imager->new;
219 if ($img->read(fh=>$fh)) {
220 # we can now process the image
223 # else, you probably have an incorrect form or input tag
225 # else, the user didn't select a file
227 See C<samples/samp-scale.cgi> and C<samples/samp-tags.cgi> in the
228 Imager distribution for example code.
232 =head2 Adding a border to an image
234 First make a new image with space for the border:
236 my $border_width = ...;
237 my $border_height = ...;
238 my $out = Imager->new(xsize => $source->getwidth() + 2 * $border_width,
239 ysize => $source->getheight() + 2 * $border_height,
240 bits => $source->bits,
241 channels => $source->getchannels);
243 Then paste the source image into the new image:
245 $out->paste(left => $border_width,
246 top => $border_height,
249 Whether you draw the border before or after pasting the original image
250 depends on whether you want the border to overlap the image, for
251 example a semi-tranparent border drawn after pasting the source image
252 could overlap the edge without hiding it.
254 If you want a solid border you could just fill the image before
255 pasting the source for simplicity:
257 $out->box(filled=>1, color=>'red');
258 $out->paste(left => $border_width,
259 top => $border_height,
269 =head2 Measuring text
271 =head2 Word wrapping text
273 =head2 Shearing (slanting) or Rotating text
275 This requires that you have Imager installed with Freetype 2.x support
276 installed, and that the font be created using the Freetype 2.x driver,
279 my $font = Imager::Font->new(file=>$fontfile, type=>'ft2');
281 First you need a transformation matrix, for shearing that could be:
283 my $angle_in_radians = ...;
284 my $tan_angle = sin($angle_rads) / cos($angle_rads);
285 # shear horizontally, supply this as y instead to do it vertically
286 my $matrix = Imager::Matrix2d->shear(x=>$tan_angle);
288 For rotation that would be:
290 my $matrix = Imager::Matrix2d->rotate(radians => $angle_in_radians);
294 my $matrix = Imager::Matrix2d->rotate(degrees => $angle_in_degrees);
296 Feed that to the font object:
298 $font->transform(matrix => $matrix);
300 and draw the text as normal:
302 $image->string(string => $text,
308 See samples/slant_text.pl for a comprehensive example, including
309 calculating the transformed bounding box to create an image to fit the
310 transformed text into.
312 =head1 IMAGE TRANSFORMATION
314 =head2 Shearing an image
318 =head2 Image spatial resolution.
324 Tony Cook <tony@develop-help.com>
328 L<Imager>, L<Imager::Files>, L<Imager::Draw>.