4 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS %formats $DEBUG %filters %DSOs $ERRSTR $fontstate %OPCODES $I2P $FORMATGUESS);
81 i_writetiff_wiol_faxable
148 $VERSION = '0.39pre1';
149 @ISA = qw(Exporter DynaLoader);
150 bootstrap Imager $VERSION;
154 i_init_fonts(); # Initialize font engines
155 Imager::Font::__init();
156 for(i_list_formats()) { $formats{$_}++; }
158 if ($formats{'t1'}) {
162 if (!$formats{'t1'} and !$formats{'tt'}
163 && !$formats{'ft2'} && !$formats{'w32'}) {
164 $fontstate='no font support';
167 %OPCODES=(Add=>[0],Sub=>[1],Mult=>[2],Div=>[3],Parm=>[4],'sin'=>[5],'cos'=>[6],'x'=>[4,0],'y'=>[4,1]);
171 # the members of the subhashes under %filters are:
172 # callseq - a list of the parameters to the underlying filter in the
173 # order they are passed
174 # callsub - a code ref that takes a named parameter list and calls the
176 # defaults - a hash of default values
177 # names - defines names for value of given parameters so if the names
178 # field is foo=> { bar=>1 }, and the user supplies "bar" as the
179 # foo parameter, the filter will receive 1 for the foo
182 callseq => ['image','intensity'],
183 callsub => sub { my %hsh=@_; i_contrast($hsh{image},$hsh{intensity}); }
187 callseq => ['image', 'amount', 'subtype'],
188 defaults => { amount=>3,subtype=>0 },
189 callsub => sub { my %hsh=@_; i_noise($hsh{image},$hsh{amount},$hsh{subtype}); }
192 $filters{hardinvert} ={
193 callseq => ['image'],
195 callsub => sub { my %hsh=@_; i_hardinvert($hsh{image}); }
198 $filters{autolevels} ={
199 callseq => ['image','lsat','usat','skew'],
200 defaults => { lsat=>0.1,usat=>0.1,skew=>0.0 },
201 callsub => sub { my %hsh=@_; i_autolevels($hsh{image},$hsh{lsat},$hsh{usat},$hsh{skew}); }
204 $filters{turbnoise} ={
205 callseq => ['image'],
206 defaults => { xo=>0.0,yo=>0.0,scale=>10.0 },
207 callsub => sub { my %hsh=@_; i_turbnoise($hsh{image},$hsh{xo},$hsh{yo},$hsh{scale}); }
210 $filters{radnoise} ={
211 callseq => ['image'],
212 defaults => { xo=>100,yo=>100,ascale=>17.0,rscale=>0.02 },
213 callsub => sub { my %hsh=@_; i_radnoise($hsh{image},$hsh{xo},$hsh{yo},$hsh{rscale},$hsh{ascale}); }
217 callseq => ['image', 'coef'],
219 callsub => sub { my %hsh=@_; i_conv($hsh{image},$hsh{coef}); }
223 callseq => ['image', 'xo', 'yo', 'colors', 'dist'],
225 callsub => sub { my %hsh=@_; i_gradgen($hsh{image}, $hsh{xo}, $hsh{yo}, $hsh{colors}, $hsh{dist}); }
228 $filters{nearest_color} ={
229 callseq => ['image', 'xo', 'yo', 'colors', 'dist'],
231 callsub => sub { my %hsh=@_; i_nearest_color($hsh{image}, $hsh{xo}, $hsh{yo}, $hsh{colors}, $hsh{dist}); }
233 $filters{gaussian} = {
234 callseq => [ 'image', 'stddev' ],
236 callsub => sub { my %hsh = @_; i_gaussian($hsh{image}, $hsh{stddev}); },
240 callseq => [ qw(image size) ],
241 defaults => { size => 20 },
242 callsub => sub { my %hsh = @_; i_mosaic($hsh{image}, $hsh{size}) },
246 callseq => [ qw(image bump elevation lightx lighty st) ],
247 defaults => { elevation=>0, st=> 2 },
250 i_bumpmap($hsh{image}, $hsh{bump}{IMG}, $hsh{elevation},
251 $hsh{lightx}, $hsh{lighty}, $hsh{st});
254 $filters{postlevels} =
256 callseq => [ qw(image levels) ],
257 defaults => { levels => 10 },
258 callsub => sub { my %hsh = @_; i_postlevels($hsh{image}, $hsh{levels}); },
260 $filters{watermark} =
262 callseq => [ qw(image wmark tx ty pixdiff) ],
263 defaults => { pixdiff=>10, tx=>0, ty=>0 },
267 i_watermark($hsh{image}, $hsh{wmark}{IMG}, $hsh{tx}, $hsh{ty},
273 callseq => [ qw(image xa ya xb yb ftype repeat combine super_sample ssample_param segments) ],
275 ftype => { linear => 0,
281 repeat => { none => 0,
294 defaults => { ftype => 0, repeat => 0, combine => 0,
295 super_sample => 0, ssample_param => 4,
298 Imager::Color->new(0,0,0),
299 Imager::Color->new(255, 255, 255),
307 i_fountain($hsh{image}, $hsh{xa}, $hsh{ya}, $hsh{xb}, $hsh{yb},
308 $hsh{ftype}, $hsh{repeat}, $hsh{combine}, $hsh{super_sample},
309 $hsh{ssample_param}, $hsh{segments});
313 $FORMATGUESS=\&def_guess_type;
321 # NOTE: this might be moved to an import override later on
325 # (look through @_ for special tags, process, and remove them);
327 # print Dumper($pack);
332 my %parms=(loglevel=>1,@_);
334 init_log($parms{'log'},$parms{'loglevel'});
337 # if ($parms{T1LIB_CONFIG}) { $ENV{T1LIB_CONFIG}=$parms{T1LIB_CONFIG}; }
338 # if ( $ENV{T1LIB_CONFIG} and ( $fontstate eq 'missing conf' )) {
346 print "shutdown code\n";
347 # for(keys %instances) { $instances{$_}->DESTROY(); }
348 malloc_state(); # how do decide if this should be used? -- store something from the import
349 print "Imager exiting\n";
353 # Load a filter plugin
358 my ($DSO_handle,$str)=DSO_open($filename);
359 if (!defined($DSO_handle)) { $Imager::ERRSTR="Couldn't load plugin '$filename'\n"; return undef; }
360 my %funcs=DSO_funclist($DSO_handle);
361 if ($DEBUG) { print "loading module $filename\n"; $i=0; for(keys %funcs) { printf(" %2d: %s\n",$i++,$_); } }
363 for(keys %funcs) { if ($filters{$_}) { $ERRSTR="filter '$_' already exists\n"; DSO_close($DSO_handle); return undef; } }
365 $DSOs{$filename}=[$DSO_handle,\%funcs];
368 my $evstr="\$filters{'".$_."'}={".$funcs{$_}.'};';
369 $DEBUG && print "eval string:\n",$evstr,"\n";
381 if (!$DSOs{$filename}) { $ERRSTR="plugin '$filename' not loaded."; return undef; }
382 my ($DSO_handle,$funcref)=@{$DSOs{$filename}};
383 for(keys %{$funcref}) {
385 $DEBUG && print "unloading: $_\n";
387 my $rc=DSO_close($DSO_handle);
388 if (!defined($rc)) { $ERRSTR="unable to unload plugin '$filename'."; return undef; }
392 # take the results of i_error() and make a message out of it
394 return join(": ", map $_->[0], i_errors());
398 # Methods to be called on objects.
401 # Create a new Imager object takes very few parameters.
402 # usually you call this method and then call open from
403 # the resulting object
410 $self->{IMG}=undef; # Just to indicate what exists
411 $self->{ERRSTR}=undef; #
412 $self->{DEBUG}=$DEBUG;
413 $self->{DEBUG} && print "Initialized Imager\n";
414 if ($hsh{xsize} && $hsh{ysize}) { $self->img_set(%hsh); }
418 # Copy an entire image with no changes
419 # - if an image has magic the copy of it will not be magical
423 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
425 my $newcopy=Imager->new();
426 $newcopy->{IMG}=i_img_new();
427 i_copy($newcopy->{IMG},$self->{IMG});
435 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
436 my %input=(left=>0, top=>0, @_);
437 unless($input{img}) {
438 $self->{ERRSTR}="no source image";
441 $input{left}=0 if $input{left} <= 0;
442 $input{top}=0 if $input{top} <= 0;
444 my($r,$b)=i_img_info($src->{IMG});
446 i_copyto($self->{IMG}, $src->{IMG},
447 0,0, $r, $b, $input{left}, $input{top});
448 return $self; # What should go here??
451 # Crop an image - i.e. return a new image that is smaller
455 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
456 my %hsh=(left=>0,right=>0,top=>0,bottom=>0,@_);
458 my ($w,$h,$l,$r,$b,$t)=($self->getwidth(),$self->getheight(),
459 @hsh{qw(left right bottom top)});
460 $l=0 if not defined $l;
461 $t=0 if not defined $t;
463 $r||=$l+delete $hsh{'width'} if defined $l and exists $hsh{'width'};
464 $b||=$t+delete $hsh{'height'} if defined $t and exists $hsh{'height'};
465 $l||=$r-delete $hsh{'width'} if defined $r and exists $hsh{'width'};
466 $t||=$b-delete $hsh{'height'} if defined $b and exists $hsh{'height'};
468 $r=$self->getwidth if not defined $r;
469 $b=$self->getheight if not defined $b;
471 ($l,$r)=($r,$l) if $l>$r;
472 ($t,$b)=($b,$t) if $t>$b;
475 $l=int(0.5+($w-$hsh{'width'})/2);
480 if ($hsh{'height'}) {
481 $b=int(0.5+($h-$hsh{'height'})/2);
482 $t=$h+$hsh{'height'};
484 $hsh{'height'}=$b-$t;
487 # print "l=$l, r=$r, h=$hsh{'width'}\n";
488 # print "t=$t, b=$b, w=$hsh{'height'}\n";
490 my $dst=Imager->new(xsize=>$hsh{'width'}, ysize=>$hsh{'height'}, channels=>$self->getchannels());
492 i_copyto($dst->{IMG},$self->{IMG},$l,$t,$r,$b,0,0);
496 # Sets an image to a certain size and channel number
497 # if there was previously data in the image it is discarded
502 my %hsh=(xsize=>100, ysize=>100, channels=>3, bits=>8, type=>'direct', @_);
504 if (defined($self->{IMG})) {
505 # let IIM_DESTROY destroy it, it's possible this image is
506 # referenced from a virtual image (like masked)
507 #i_img_destroy($self->{IMG});
511 if ($hsh{type} eq 'paletted' || $hsh{type} eq 'pseudo') {
512 $self->{IMG} = i_img_pal_new($hsh{xsize}, $hsh{ysize}, $hsh{channels},
513 $hsh{maxcolors} || 256);
515 elsif ($hsh{bits} == 16) {
516 $self->{IMG} = i_img_16_new($hsh{xsize}, $hsh{ysize}, $hsh{channels});
519 $self->{IMG}=Imager::ImgRaw::new($hsh{'xsize'}, $hsh{'ysize'},
524 # created a masked version of the current image
528 $self or return undef;
529 my %opts = (left => 0,
531 right => $self->getwidth,
532 bottom => $self->getheight,
534 my $mask = $opts{mask} ? $opts{mask}{IMG} : undef;
536 my $result = Imager->new;
537 $result->{IMG} = i_img_masked_new($self->{IMG}, $mask, $opts{left},
538 $opts{top}, $opts{right} - $opts{left},
539 $opts{bottom} - $opts{top});
540 # keep references to the mask and base images so they don't
542 $result->{DEPENDS} = [ $self->{IMG}, $mask ];
547 # convert an RGB image into a paletted image
551 if (@_ != 1 && !ref $_[0]) {
558 my $result = Imager->new;
559 $result->{IMG} = i_img_to_pal($self->{IMG}, $opts);
561 #print "Type ", i_img_type($result->{IMG}), "\n";
563 $result->{IMG} or undef $result;
568 # convert a paletted (or any image) to an 8-bit/channel RGB images
574 $result = Imager->new;
575 $result->{IMG} = i_img_to_rgb($self->{IMG})
584 my %opts = (colors=>[], @_);
586 @{$opts{colors}} or return undef;
588 $self->{IMG} and i_addcolors($self->{IMG}, @{$opts{colors}});
593 my %opts = (start=>0, colors=>[], @_);
594 @{$opts{colors}} or return undef;
596 $self->{IMG} and i_setcolors($self->{IMG}, $opts{start}, @{$opts{colors}});
602 if (!exists $opts{start} && !exists $opts{count}) {
605 $opts{count} = $self->colorcount;
607 elsif (!exists $opts{count}) {
610 elsif (!exists $opts{start}) {
615 return i_getcolors($self->{IMG}, $opts{start}, $opts{count});
619 i_colorcount($_[0]{IMG});
623 i_maxcolors($_[0]{IMG});
629 $opts{color} or return undef;
631 $self->{IMG} and i_findcolor($self->{IMG}, $opts{color});
636 $self->{IMG} and i_img_bits($self->{IMG});
642 return i_img_type($self->{IMG}) ? "paletted" : "direct";
648 $self->{IMG} and i_img_virtual($self->{IMG});
652 my ($self, %opts) = @_;
654 $self->{IMG} or return;
656 if (defined $opts{name}) {
660 while (defined($found = i_tags_find($self->{IMG}, $opts{name}, $start))) {
661 push @result, (i_tags_get($self->{IMG}, $found))[1];
664 return wantarray ? @result : $result[0];
666 elsif (defined $opts{code}) {
670 while (defined($found = i_tags_findn($self->{IMG}, $opts{code}, $start))) {
671 push @result, (i_tags_get($self->{IMG}, $found))[1];
678 return map { [ i_tags_get($self->{IMG}, $_) ] } 0.. i_tags_count($self->{IMG})-1;
681 return i_tags_count($self->{IMG});
690 return -1 unless $self->{IMG};
692 if (defined $opts{value}) {
693 if ($opts{value} =~ /^\d+$/) {
695 return i_tags_addn($self->{IMG}, $opts{name}, 0, $opts{value});
698 return i_tags_add($self->{IMG}, $opts{name}, 0, $opts{value}, 0);
701 elsif (defined $opts{data}) {
702 # force addition as a string
703 return i_tags_add($self->{IMG}, $opts{name}, 0, $opts{data}, 0);
706 $self->{ERRSTR} = "No value supplied";
710 elsif ($opts{code}) {
711 if (defined $opts{value}) {
712 if ($opts{value} =~ /^\d+$/) {
714 return i_tags_addn($self->{IMG}, $opts{code}, 0, $opts{value});
717 return i_tags_add($self->{IMG}, $opts{code}, 0, $opts{value}, 0);
720 elsif (defined $opts{data}) {
721 # force addition as a string
722 return i_tags_add($self->{IMG}, $opts{code}, 0, $opts{data}, 0);
725 $self->{ERRSTR} = "No value supplied";
738 return 0 unless $self->{IMG};
740 if (defined $opts{index}) {
741 return i_tags_delete($self->{IMG}, $opts{index});
743 elsif (defined $opts{name}) {
744 return i_tags_delbyname($self->{IMG}, $opts{name});
746 elsif (defined $opts{code}) {
747 return i_tags_delbycode($self->{IMG}, $opts{code});
750 $self->{ERRSTR} = "Need to supply index, name, or code parameter";
755 # Read an image from file
762 if (defined($self->{IMG})) {
763 # let IIM_DESTROY do the destruction, since the image may be
764 # referenced from elsewhere
765 #i_img_destroy($self->{IMG});
769 if (!$input{fd} and !$input{file} and !$input{data}) {
770 $self->{ERRSTR}='no file, fd or data parameter'; return undef;
773 $fh = new IO::File($input{file},"r");
775 $self->{ERRSTR}='Could not open file'; return undef;
784 # FIXME: Find the format here if not specified
785 # yes the code isn't here yet - next week maybe?
786 # Next week? Are you high or something? That comment
787 # has been there for half a year dude.
788 # Look, i just work here, ok?
790 if (!$input{type} and $input{file}) {
791 $input{type}=$FORMATGUESS->($input{file});
793 if (!$formats{$input{type}}) {
794 $self->{ERRSTR}='format not supported'; return undef;
797 my %iolready=(jpeg=>1, png=>1, tiff=>1, pnm=>1, raw=>1, bmp=>1);
799 if ($iolready{$input{type}}) {
801 $IO = io_new_fd($fd); # sort of simple for now eh?
803 if ( $input{type} eq 'jpeg' ) {
804 ($self->{IMG},$self->{IPTCRAW})=i_readjpeg_wiol( $IO );
805 if ( !defined($self->{IMG}) ) {
806 $self->{ERRSTR}='unable to read jpeg image'; return undef;
808 $self->{DEBUG} && print "loading a jpeg file\n";
812 if ( $input{type} eq 'tiff' ) {
813 $self->{IMG}=i_readtiff_wiol( $IO, -1 ); # Fixme, check if that length parameter is ever needed
814 if ( !defined($self->{IMG}) ) {
815 $self->{ERRSTR}='unable to read tiff image'; return undef;
817 $self->{DEBUG} && print "loading a tiff file\n";
821 if ( $input{type} eq 'pnm' ) {
822 $self->{IMG}=i_readpnm_wiol( $IO, -1 ); # Fixme, check if that length parameter is ever needed
823 if ( !defined($self->{IMG}) ) {
824 $self->{ERRSTR}='unable to read pnm image: '._error_as_msg(); return undef;
826 $self->{DEBUG} && print "loading a pnm file\n";
830 if ( $input{type} eq 'png' ) {
831 $self->{IMG}=i_readpng_wiol( $IO, -1 ); # Fixme, check if that length parameter is ever needed
832 if ( !defined($self->{IMG}) ) {
833 $self->{ERRSTR}='unable to read png image';
836 $self->{DEBUG} && print "loading a png file\n";
839 if ( $input{type} eq 'bmp' ) {
840 $self->{IMG}=i_readbmp_wiol( $IO );
841 if ( !defined($self->{IMG}) ) {
842 $self->{ERRSTR}='unable to read bmp image';
845 $self->{DEBUG} && print "loading a bmp file\n";
848 if ( $input{type} eq 'raw' ) {
849 my %params=(datachannels=>3,storechannels=>3,interleave=>1,%input);
851 if ( !($params{xsize} && $params{ysize}) ) {
852 $self->{ERRSTR}='missing xsize or ysize parameter for raw';
856 $self->{IMG} = i_readraw_wiol( $IO,
859 $params{datachannels},
860 $params{storechannels},
861 $params{interleave});
862 if ( !defined($self->{IMG}) ) {
863 $self->{ERRSTR}='unable to read raw image';
866 $self->{DEBUG} && print "loading a raw file\n";
871 # Old code for reference while changing the new stuff
873 if (!$input{type} and $input{file}) {
874 $input{type}=$FORMATGUESS->($input{file});
878 $self->{ERRSTR}='type parameter missing and not possible to guess from extension'; return undef;
881 if (!$formats{$input{type}}) {
882 $self->{ERRSTR}='format not supported';
887 $fh = new IO::File($input{file},"r");
889 $self->{ERRSTR}='Could not open file';
900 if ( $input{type} eq 'gif' ) {
902 if ($input{colors} && !ref($input{colors})) {
903 # must be a reference to a scalar that accepts the colour map
904 $self->{ERRSTR} = "option 'colors' must be a scalar reference";
907 if (exists $input{data}) {
908 if ($input{colors}) {
909 ($self->{IMG}, $colors) = i_readgif_scalar($input{data});
911 $self->{IMG}=i_readgif_scalar($input{data});
914 if ($input{colors}) {
915 ($self->{IMG}, $colors) = i_readgif( $fd );
917 $self->{IMG} = i_readgif( $fd )
921 # we may or may not change i_readgif to return blessed objects...
922 ${ $input{colors} } = [ map { NC(@$_) } @$colors ];
924 if ( !defined($self->{IMG}) ) {
925 $self->{ERRSTR}= 'reading GIF:'._error_as_msg();
928 $self->{DEBUG} && print "loading a gif file\n";
934 # Write an image to file
937 my %input=(jpegquality=>75, gifquant=>'mc', lmdither=>6.0, lmfixed=>[],
939 my ($fh, $rc, $fd, $IO);
941 my %iolready=( tiff=>1, raw=>1, png=>1, pnm=>1, bmp=>1, jpeg=>1 ); # this will be SO MUCH BETTER once they are all in there
943 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
945 if (!$input{file} and !$input{'fd'} and !$input{'data'}) { $self->{ERRSTR}='file/fd/data parameter missing'; return undef; }
946 if (!$input{type} and $input{file}) { $input{type}=$FORMATGUESS->($input{file}); }
947 if (!$input{type}) { $self->{ERRSTR}='type parameter missing and not possible to guess from extension'; return undef; }
949 if (!$formats{$input{type}}) { $self->{ERRSTR}='format not supported'; return undef; }
951 if (exists $input{'fd'}) {
953 } elsif (exists $input{'data'}) {
954 $IO = Imager::io_new_bufchain();
956 $fh = new IO::File($input{file},"w+");
957 if (!defined $fh) { $self->{ERRSTR}='Could not open file'; return undef; }
962 if ($iolready{$input{type}}) {
964 $IO = io_new_fd($fd);
967 if ($input{type} eq 'tiff') {
968 if (defined $input{class} && $input{class} eq 'fax') {
969 if (!i_writetiff_wiol_faxable($self->{IMG}, $IO, $input{fax_fine})) {
970 $self->{ERRSTR}='Could not write to buffer';
974 if (!i_writetiff_wiol($self->{IMG}, $IO)) {
975 $self->{ERRSTR}='Could not write to buffer';
979 } elsif ( $input{type} eq 'pnm' ) {
980 if ( ! i_writeppm_wiol($self->{IMG},$IO) ) {
981 $self->{ERRSTR}='unable to write pnm image';
984 $self->{DEBUG} && print "writing a pnm file\n";
985 } elsif ( $input{type} eq 'raw' ) {
986 if ( !i_writeraw_wiol($self->{IMG},$IO) ) {
987 $self->{ERRSTR}='unable to write raw image';
990 $self->{DEBUG} && print "writing a raw file\n";
991 } elsif ( $input{type} eq 'png' ) {
992 if ( !i_writepng_wiol($self->{IMG}, $IO) ) {
993 $self->{ERRSTR}='unable to write png image';
996 $self->{DEBUG} && print "writing a png file\n";
997 } elsif ( $input{type} eq 'jpeg' ) {
998 if ( !i_writejpeg_wiol($self->{IMG}, $IO, $input{jpegquality})) {
999 $self->{ERRSTR}='unable to write jpeg image';
1002 $self->{DEBUG} && print "writing a jpeg file\n";
1003 } elsif ( $input{type} eq 'bmp' ) {
1004 if ( !i_writebmp_wiol($self->{IMG}, $IO) ) {
1005 $self->{ERRSTR}='unable to write bmp image';
1008 $self->{DEBUG} && print "writing a bmp file\n";
1011 if (exists $input{'data'}) {
1012 my $data = io_slurp($IO);
1014 $self->{ERRSTR}='Could not slurp from buffer';
1017 ${$input{data}} = $data;
1021 if ( $input{type} eq 'gif' ) {
1022 if (not $input{gifplanes}) {
1024 my $count=i_count_colors($self->{IMG}, 256);
1025 $gp=8 if $count == -1;
1026 $gp=1 if not $gp and $count <= 2;
1027 $gp=2 if not $gp and $count <= 4;
1028 $gp=3 if not $gp and $count <= 8;
1029 $gp=4 if not $gp and $count <= 16;
1030 $gp=5 if not $gp and $count <= 32;
1031 $gp=6 if not $gp and $count <= 64;
1032 $gp=7 if not $gp and $count <= 128;
1033 $input{gifplanes} = $gp || 8;
1036 if ($input{gifplanes}>8) {
1037 $input{gifplanes}=8;
1039 if ($input{gifquant} eq 'gen' || $input{callback}) {
1042 if ($input{gifquant} eq 'lm') {
1044 $input{make_colors} = 'addi';
1045 $input{translate} = 'perturb';
1046 $input{perturb} = $input{lmdither};
1047 } elsif ($input{gifquant} eq 'gen') {
1048 # just pass options through
1050 $input{make_colors} = 'webmap'; # ignored
1051 $input{translate} = 'giflib';
1054 if ($input{callback}) {
1055 defined $input{maxbuffer} or $input{maxbuffer} = -1;
1056 $rc = i_writegif_callback($input{callback}, $input{maxbuffer},
1057 \%input, $self->{IMG});
1059 $rc = i_writegif_gen($fd, \%input, $self->{IMG});
1062 } elsif ($input{gifquant} eq 'lm') {
1063 $rc=i_writegif($self->{IMG},$fd,$input{gifplanes},$input{lmdither},$input{lmfixed});
1065 $rc=i_writegifmc($self->{IMG},$fd,$input{gifplanes});
1067 if ( !defined($rc) ) {
1068 $self->{ERRSTR} = "Writing GIF file: "._error_as_msg(); return undef;
1070 $self->{DEBUG} && print "writing a gif file\n";
1078 my ($class, $opts, @images) = @_;
1080 if ($opts->{type} eq 'gif') {
1081 my $gif_delays = $opts->{gif_delays};
1082 local $opts->{gif_delays} = $gif_delays;
1083 unless (ref $opts->{gif_delays}) {
1084 # assume the caller wants the same delay for each frame
1085 $opts->{gif_delays} = [ ($gif_delays) x @images ];
1087 # translate to ImgRaw
1088 if (grep !UNIVERSAL::isa($_, 'Imager') || !$_->{IMG}, @images) {
1089 $ERRSTR = "Usage: Imager->write_multi({ options }, @images)";
1092 my @work = map $_->{IMG}, @images;
1093 if ($opts->{callback}) {
1094 # Note: you may need to fix giflib for this one to work
1095 my $maxbuffer = $opts->{maxbuffer};
1096 defined $maxbuffer or $maxbuffer = -1; # max by default
1097 return i_writegif_callback($opts->{callback}, $maxbuffer,
1101 return i_writegif_gen($opts->{fd}, $opts, @work);
1104 my $fh = IO::File->new($opts->{file}, "w+");
1106 $ERRSTR = "Error creating $opts->{file}: $!";
1110 return i_writegif_gen(fileno($fh), $opts, @work);
1114 $ERRSTR = "Sorry, write_multi doesn't support $opts->{type} yet";
1119 # read multiple images from a file
1121 my ($class, %opts) = @_;
1123 if ($opts{file} && !exists $opts{type}) {
1125 my $type = $FORMATGUESS->($opts{file});
1126 $opts{type} = $type;
1128 unless ($opts{type}) {
1129 $ERRSTR = "No type parameter supplied and it couldn't be guessed";
1135 $file = IO::File->new($opts{file}, "r");
1137 $ERRSTR = "Could not open file $opts{file}: $!";
1141 $fd = fileno($file);
1144 $fd = fileno($opts{fh});
1146 $ERRSTR = "File handle specified with fh option not open";
1153 elsif ($opts{callback} || $opts{data}) {
1157 $ERRSTR = "You need to specify one of file, fd, fh, callback or data";
1161 if ($opts{type} eq 'gif') {
1164 @imgs = i_readgif_multi($fd);
1167 if (Imager::i_giflib_version() < 4.0) {
1168 $ERRSTR = "giflib3.x does not support callbacks";
1171 if ($opts{callback}) {
1172 @imgs = i_readgif_multi_callback($opts{callback})
1175 @imgs = i_readgif_multi_scalar($opts{data});
1180 bless { IMG=>$_, DEBUG=>$DEBUG, ERRSTR=>undef }, 'Imager'
1184 $ERRSTR = _error_as_msg();
1189 $ERRSTR = "Cannot read multiple images from $opts{type} files";
1193 # Destroy an Imager object
1197 # delete $instances{$self};
1198 if (defined($self->{IMG})) {
1199 # the following is now handled by the XS DESTROY method for
1200 # Imager::ImgRaw object
1201 # Re-enabling this will break virtual images
1202 # tested for in t/t020masked.t
1203 # i_img_destroy($self->{IMG});
1204 undef($self->{IMG});
1206 # print "Destroy Called on an empty image!\n"; # why did I put this here??
1210 # Perform an inplace filter of an image
1211 # that is the image will be overwritten with the data
1217 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1219 if (!$input{type}) { $self->{ERRSTR}='type parameter missing'; return undef; }
1221 if ( (grep { $_ eq $input{type} } keys %filters) != 1) {
1222 $self->{ERRSTR}='type parameter not matching any filter'; return undef;
1225 if ($filters{$input{type}}{names}) {
1226 my $names = $filters{$input{type}}{names};
1227 for my $name (keys %$names) {
1228 if (defined $input{$name} && exists $names->{$name}{$input{$name}}) {
1229 $input{$name} = $names->{$name}{$input{$name}};
1233 if (defined($filters{$input{type}}{defaults})) {
1234 %hsh=('image',$self->{IMG},%{$filters{$input{type}}{defaults}},%input);
1236 %hsh=('image',$self->{IMG},%input);
1239 my @cs=@{$filters{$input{type}}{callseq}};
1242 if (!defined($hsh{$_})) {
1243 $self->{ERRSTR}="missing parameter '$_' for filter ".$input{type}; return undef;
1247 &{$filters{$input{type}}{callsub}}(%hsh);
1251 $self->{DEBUG} && print "callseq is: @cs\n";
1252 $self->{DEBUG} && print "matching callseq is: @b\n";
1257 # Scale an image to requested size and return the scaled version
1261 my %opts=(scalefactor=>0.5,type=>'max',qtype=>'normal',@_);
1262 my $img = Imager->new();
1263 my $tmp = Imager->new();
1265 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1267 if ($opts{xpixels} and $opts{ypixels} and $opts{type}) {
1268 my ($xpix,$ypix)=( $opts{xpixels}/$self->getwidth() , $opts{ypixels}/$self->getheight() );
1269 if ($opts{type} eq 'min') { $opts{scalefactor}=min($xpix,$ypix); }
1270 if ($opts{type} eq 'max') { $opts{scalefactor}=max($xpix,$ypix); }
1271 } elsif ($opts{xpixels}) { $opts{scalefactor}=$opts{xpixels}/$self->getwidth(); }
1272 elsif ($opts{ypixels}) { $opts{scalefactor}=$opts{ypixels}/$self->getheight(); }
1274 if ($opts{qtype} eq 'normal') {
1275 $tmp->{IMG}=i_scaleaxis($self->{IMG},$opts{scalefactor},0);
1276 if ( !defined($tmp->{IMG}) ) { $self->{ERRSTR}='unable to scale image'; return undef; }
1277 $img->{IMG}=i_scaleaxis($tmp->{IMG},$opts{scalefactor},1);
1278 if ( !defined($img->{IMG}) ) { $self->{ERRSTR}='unable to scale image'; return undef; }
1281 if ($opts{'qtype'} eq 'preview') {
1282 $img->{IMG}=i_scale_nn($self->{IMG},$opts{'scalefactor'},$opts{'scalefactor'});
1283 if ( !defined($img->{IMG}) ) { $self->{ERRSTR}='unable to scale image'; return undef; }
1286 $self->{ERRSTR}='scale: invalid value for qtype'; return undef;
1289 # Scales only along the X axis
1293 my %opts=(scalefactor=>0.5,@_);
1295 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1297 my $img = Imager->new();
1299 if ($opts{pixels}) { $opts{scalefactor}=$opts{pixels}/$self->getwidth(); }
1301 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1302 $img->{IMG}=i_scaleaxis($self->{IMG},$opts{scalefactor},0);
1304 if ( !defined($img->{IMG}) ) { $self->{ERRSTR}='unable to scale image'; return undef; }
1308 # Scales only along the Y axis
1312 my %opts=(scalefactor=>0.5,@_);
1314 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1316 my $img = Imager->new();
1318 if ($opts{pixels}) { $opts{scalefactor}=$opts{pixels}/$self->getheight(); }
1320 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1321 $img->{IMG}=i_scaleaxis($self->{IMG},$opts{scalefactor},1);
1323 if ( !defined($img->{IMG}) ) { $self->{ERRSTR}='unable to scale image'; return undef; }
1328 # Transform returns a spatial transformation of the input image
1329 # this moves pixels to a new location in the returned image.
1330 # NOTE - should make a utility function to check transforms for
1335 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1337 my (@op,@ropx,@ropy,$iop,$or,@parm,$expr,@xt,@yt,@pt,$numre);
1339 # print Dumper(\%opts);
1342 if ( $opts{'xexpr'} and $opts{'yexpr'} ) {
1344 eval ("use Affix::Infix2Postfix;");
1347 $self->{ERRSTR}='transform: expr given and Affix::Infix2Postfix is not avaliable.';
1350 $I2P=Affix::Infix2Postfix->new('ops'=>[{op=>'+',trans=>'Add'},
1351 {op=>'-',trans=>'Sub'},
1352 {op=>'*',trans=>'Mult'},
1353 {op=>'/',trans=>'Div'},
1354 {op=>'-',type=>'unary',trans=>'u-'},
1356 {op=>'func',type=>'unary'}],
1357 'grouping'=>[qw( \( \) )],
1358 'func'=>[qw( sin cos )],
1363 @xt=$I2P->translate($opts{'xexpr'});
1364 @yt=$I2P->translate($opts{'yexpr'});
1366 $numre=$I2P->{'numre'};
1369 for(@xt) { if (/$numre/) { push(@pt,$_); push(@{$opts{'xopcodes'}},'Parm',$#pt); } else { push(@{$opts{'xopcodes'}},$_); } }
1370 for(@yt) { if (/$numre/) { push(@pt,$_); push(@{$opts{'yopcodes'}},'Parm',$#pt); } else { push(@{$opts{'yopcodes'}},$_); } }
1371 @{$opts{'parm'}}=@pt;
1374 # print Dumper(\%opts);
1376 if ( !exists $opts{'xopcodes'} or @{$opts{'xopcodes'}}==0) {
1377 $self->{ERRSTR}='transform: no xopcodes given.';
1381 @op=@{$opts{'xopcodes'}};
1383 if (!defined ($OPCODES{$iop}) and ($iop !~ /^\d+$/) ) {
1384 $self->{ERRSTR}="transform: illegal opcode '$_'.";
1387 push(@ropx,(exists $OPCODES{$iop}) ? @{$OPCODES{$iop}} : $iop );
1393 if ( !exists $opts{'yopcodes'} or @{$opts{'yopcodes'}}==0) {
1394 $self->{ERRSTR}='transform: no yopcodes given.';
1398 @op=@{$opts{'yopcodes'}};
1400 if (!defined ($OPCODES{$iop}) and ($iop !~ /^\d+$/) ) {
1401 $self->{ERRSTR}="transform: illegal opcode '$_'.";
1404 push(@ropy,(exists $OPCODES{$iop}) ? @{$OPCODES{$iop}} : $iop );
1409 if ( !exists $opts{'parm'}) {
1410 $self->{ERRSTR}='transform: no parameter arg given.';
1414 # print Dumper(\@ropx);
1415 # print Dumper(\@ropy);
1416 # print Dumper(\@ropy);
1418 my $img = Imager->new();
1419 $img->{IMG}=i_transform($self->{IMG},\@ropx,\@ropy,$opts{'parm'});
1420 if ( !defined($img->{IMG}) ) { $self->{ERRSTR}='transform: failed'; return undef; }
1428 my ($opts, @imgs) = @_;
1431 # this is fairly big, delay loading it
1432 eval "use Imager::Expr";
1437 $opts->{variables} = [ qw(x y) ];
1438 my ($width, $height) = @{$opts}{qw(width height)};
1440 $width ||= $imgs[0]->getwidth();
1441 $height ||= $imgs[0]->getheight();
1443 for my $img (@imgs) {
1444 $opts->{constants}{"w$img_num"} = $img->getwidth();
1445 $opts->{constants}{"h$img_num"} = $img->getheight();
1446 $opts->{constants}{"cx$img_num"} = $img->getwidth()/2;
1447 $opts->{constants}{"cy$img_num"} = $img->getheight()/2;
1452 $opts->{constants}{w} = $width;
1453 $opts->{constants}{cx} = $width/2;
1456 $Imager::ERRSTR = "No width supplied";
1460 $opts->{constants}{h} = $height;
1461 $opts->{constants}{cy} = $height/2;
1464 $Imager::ERRSTR = "No height supplied";
1467 my $code = Imager::Expr->new($opts);
1469 $Imager::ERRSTR = Imager::Expr::error();
1473 my $img = Imager->new();
1474 $img->{IMG} = i_transform2($opts->{width}, $opts->{height}, $code->code(),
1475 $code->nregs(), $code->cregs(),
1476 [ map { $_->{IMG} } @imgs ]);
1477 if (!defined $img->{IMG}) {
1478 $Imager::ERRSTR = "transform2 failed";
1488 my %opts=(tx=>0,ty=>0,@_);
1490 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1491 unless ($opts{src} && $opts{src}->{IMG}) { $self->{ERRSTR}='empty input image for source'; return undef; }
1493 unless (i_rubthru($self->{IMG}, $opts{src}->{IMG}, $opts{tx},$opts{ty})) {
1494 $self->{ERRSTR} = $self->_error_as_msg();
1504 my %xlate = (h=>0, v=>1, hv=>2, vh=>2);
1506 return () unless defined $opts{'dir'} and defined $xlate{$opts{'dir'}};
1507 $dir = $xlate{$opts{'dir'}};
1508 return $self if i_flipxy($self->{IMG}, $dir);
1515 if (defined $opts{right}) {
1516 my $degrees = $opts{right};
1518 $degrees += 360 * int(((-$degrees)+360)/360);
1520 $degrees = $degrees % 360;
1521 if ($degrees == 0) {
1522 return $self->copy();
1524 elsif ($degrees == 90 || $degrees == 180 || $degrees == 270) {
1525 my $result = Imager->new();
1526 if ($result->{IMG} = i_rotate90($self->{IMG}, $degrees)) {
1530 $self->{ERRSTR} = $self->_error_as_msg();
1535 $self->{ERRSTR} = "Parameter 'right' must be a multiple of 90 degrees";
1539 elsif (defined $opts{radians} || defined $opts{degrees}) {
1540 my $amount = $opts{radians} || $opts{degrees} * 3.1415926535 / 180;
1542 my $result = Imager->new;
1543 if ($result->{IMG} = i_rotate_exact($self->{IMG}, $amount)) {
1547 $self->{ERRSTR} = $self->_error_as_msg();
1552 $self->{ERRSTR} = "Only the 'right' parameter is available";
1557 sub matrix_transform {
1561 if ($opts{matrix}) {
1562 my $xsize = $opts{xsize} || $self->getwidth;
1563 my $ysize = $opts{ysize} || $self->getheight;
1565 my $result = Imager->new;
1566 $result->{IMG} = i_matrix_transform($self->{IMG}, $xsize, $ysize,
1573 $self->{ERRSTR} = "matrix parameter required";
1579 *yatf = \&matrix_transform;
1581 # These two are supported for legacy code only
1584 return Imager::Color->new(@_);
1588 return Imager::Color::set(@_);
1591 # Draws a box between the specified corner points.
1594 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1595 my $dflcl=i_color_new(255,255,255,255);
1596 my %opts=(color=>$dflcl,xmin=>0,ymin=>0,xmax=>$self->getwidth()-1,ymax=>$self->getheight()-1,@_);
1598 if (exists $opts{'box'}) {
1599 $opts{'xmin'} = min($opts{'box'}->[0],$opts{'box'}->[2]);
1600 $opts{'xmax'} = max($opts{'box'}->[0],$opts{'box'}->[2]);
1601 $opts{'ymin'} = min($opts{'box'}->[1],$opts{'box'}->[3]);
1602 $opts{'ymax'} = max($opts{'box'}->[1],$opts{'box'}->[3]);
1605 if ($opts{filled}) {
1606 i_box_filled($self->{IMG},$opts{xmin},$opts{ymin},$opts{xmax},
1607 $opts{ymax},$opts{color});
1609 elsif ($opts{fill}) {
1610 unless (UNIVERSAL::isa($opts{fill}, 'Imager::Fill')) {
1611 # assume it's a hash ref
1612 require 'Imager/Fill.pm';
1613 $opts{fill} = Imager::Fill->new(%{$opts{fill}});
1615 i_box_cfill($self->{IMG},$opts{xmin},$opts{ymin},$opts{xmax},
1616 $opts{ymax},$opts{fill}{fill});
1619 i_box($self->{IMG},$opts{xmin},$opts{ymin},$opts{xmax},$opts{ymax},$opts{color});
1624 # Draws an arc - this routine SUCKS and is buggy - it sometimes doesn't work when the arc is a convex polygon
1628 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1629 my $dflcl=i_color_new(255,255,255,255);
1630 my %opts=(color=>$dflcl,
1631 'r'=>min($self->getwidth(),$self->getheight())/3,
1632 'x'=>$self->getwidth()/2,
1633 'y'=>$self->getheight()/2,
1634 'd1'=>0, 'd2'=>361, @_);
1636 unless (UNIVERSAL::isa($opts{fill}, 'Imager::Fill')) {
1637 # assume it's a hash ref
1638 require 'Imager/Fill.pm';
1639 $opts{fill} = Imager::Fill->new(%{$opts{fill}});
1641 i_arc_cfill($self->{IMG},$opts{'x'},$opts{'y'},$opts{'r'},$opts{'d1'},
1642 $opts{'d2'}, $opts{fill}{fill});
1645 i_arc($self->{IMG},$opts{'x'},$opts{'y'},$opts{'r'},$opts{'d1'},
1646 $opts{'d2'},$opts{'color'});
1652 # Draws a line from one point to (but not including) the destination point
1656 my $dflcl=i_color_new(0,0,0,0);
1657 my %opts=(color=>$dflcl,@_);
1658 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1660 unless (exists $opts{x1} and exists $opts{y1}) { $self->{ERRSTR}='missing begining coord'; return undef; }
1661 unless (exists $opts{x2} and exists $opts{y2}) { $self->{ERRSTR}='missing ending coord'; return undef; }
1663 if ($opts{antialias}) {
1664 i_line_aa($self->{IMG},$opts{x1}, $opts{y1}, $opts{x2}, $opts{y2}, $opts{color});
1666 i_draw($self->{IMG},$opts{x1}, $opts{y1}, $opts{x2}, $opts{y2}, $opts{color});
1671 # Draws a line between an ordered set of points - It more or less just transforms this
1672 # into a list of lines.
1676 my ($pt,$ls,@points);
1677 my $dflcl=i_color_new(0,0,0,0);
1678 my %opts=(color=>$dflcl,@_);
1680 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1682 if (exists($opts{points})) { @points=@{$opts{points}}; }
1683 if (!exists($opts{points}) and exists($opts{'x'}) and exists($opts{'y'}) ) {
1684 @points=map { [ $opts{'x'}->[$_],$opts{'y'}->[$_] ] } (0..(scalar @{$opts{'x'}}-1));
1687 # print Dumper(\@points);
1689 if ($opts{antialias}) {
1691 if (defined($ls)) { i_line_aa($self->{IMG},$ls->[0],$ls->[1],$pt->[0],$pt->[1],$opts{color}); }
1696 if (defined($ls)) { i_draw($self->{IMG},$ls->[0],$ls->[1],$pt->[0],$pt->[1],$opts{color}); }
1703 # this the multipoint bezier curve
1704 # this is here more for testing that actual usage since
1705 # this is not a good algorithm. Usually the curve would be
1706 # broken into smaller segments and each done individually.
1710 my ($pt,$ls,@points);
1711 my $dflcl=i_color_new(0,0,0,0);
1712 my %opts=(color=>$dflcl,@_);
1714 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1716 if (exists $opts{points}) {
1717 $opts{'x'}=map { $_->[0]; } @{$opts{'points'}};
1718 $opts{'y'}=map { $_->[1]; } @{$opts{'points'}};
1721 unless ( @{$opts{'x'}} and @{$opts{'x'}} == @{$opts{'y'}} ) {
1722 $self->{ERRSTR}='Missing or invalid points.';
1726 i_bezier_multi($self->{IMG},$opts{'x'},$opts{'y'},$opts{'color'});
1732 my %opts = ( color=>Imager::Color->new(255, 255, 255), @_ );
1734 unless (exists $opts{x} && exists $opts{'y'}) {
1735 $self->{ERRSTR} = "missing seed x and y parameters";
1740 unless (UNIVERSAL::isa($opts{fill}, 'Imager::Fill')) {
1741 # assume it's a hash ref
1742 require 'Imager/Fill.pm';
1743 $opts{fill} = Imager::Fill->new(%{$opts{fill}});
1745 i_flood_cfill($self->{IMG}, $opts{x}, $opts{'y'}, $opts{fill}{fill});
1748 i_flood_fill($self->{IMG}, $opts{x}, $opts{'y'}, $opts{color});
1754 # make an identity matrix of the given size
1758 my $matrix = [ map { [ (0) x $size ] } 1..$size ];
1759 for my $c (0 .. ($size-1)) {
1760 $matrix->[$c][$c] = 1;
1765 # general function to convert an image
1767 my ($self, %opts) = @_;
1770 # the user can either specify a matrix or preset
1771 # the matrix overrides the preset
1772 if (!exists($opts{matrix})) {
1773 unless (exists($opts{preset})) {
1774 $self->{ERRSTR} = "convert() needs a matrix or preset";
1778 if ($opts{preset} eq 'gray' || $opts{preset} eq 'grey') {
1779 # convert to greyscale, keeping the alpha channel if any
1780 if ($self->getchannels == 3) {
1781 $matrix = [ [ 0.222, 0.707, 0.071 ] ];
1783 elsif ($self->getchannels == 4) {
1784 # preserve the alpha channel
1785 $matrix = [ [ 0.222, 0.707, 0.071, 0 ],
1790 $matrix = _identity($self->getchannels);
1793 elsif ($opts{preset} eq 'noalpha') {
1794 # strip the alpha channel
1795 if ($self->getchannels == 2 or $self->getchannels == 4) {
1796 $matrix = _identity($self->getchannels);
1797 pop(@$matrix); # lose the alpha entry
1800 $matrix = _identity($self->getchannels);
1803 elsif ($opts{preset} eq 'red' || $opts{preset} eq 'channel0') {
1805 $matrix = [ [ 1 ] ];
1807 elsif ($opts{preset} eq 'green' || $opts{preset} eq 'channel1') {
1808 $matrix = [ [ 0, 1 ] ];
1810 elsif ($opts{preset} eq 'blue' || $opts{preset} eq 'channel2') {
1811 $matrix = [ [ 0, 0, 1 ] ];
1813 elsif ($opts{preset} eq 'alpha') {
1814 if ($self->getchannels == 2 or $self->getchannels == 4) {
1815 $matrix = [ [ (0) x ($self->getchannels-1), 1 ] ];
1818 # the alpha is just 1 <shrug>
1819 $matrix = [ [ (0) x $self->getchannels, 1 ] ];
1822 elsif ($opts{preset} eq 'rgb') {
1823 if ($self->getchannels == 1) {
1824 $matrix = [ [ 1 ], [ 1 ], [ 1 ] ];
1826 elsif ($self->getchannels == 2) {
1827 # preserve the alpha channel
1828 $matrix = [ [ 1, 0 ], [ 1, 0 ], [ 1, 0 ], [ 0, 1 ] ];
1831 $matrix = _identity($self->getchannels);
1834 elsif ($opts{preset} eq 'addalpha') {
1835 if ($self->getchannels == 1) {
1836 $matrix = _identity(2);
1838 elsif ($self->getchannels == 3) {
1839 $matrix = _identity(4);
1842 $matrix = _identity($self->getchannels);
1846 $self->{ERRSTR} = "Unknown convert preset $opts{preset}";
1852 $matrix = $opts{matrix};
1855 my $new = Imager->new();
1856 $new->{IMG} = i_img_new();
1857 unless (i_convert($new->{IMG}, $self->{IMG}, $matrix)) {
1858 # most likely a bad matrix
1859 $self->{ERRSTR} = _error_as_msg();
1866 # general function to map an image through lookup tables
1869 my ($self, %opts) = @_;
1870 my @chlist = qw( red green blue alpha );
1872 if (!exists($opts{'maps'})) {
1873 # make maps from channel maps
1875 for $chnum (0..$#chlist) {
1876 if (exists $opts{$chlist[$chnum]}) {
1877 $opts{'maps'}[$chnum] = $opts{$chlist[$chnum]};
1878 } elsif (exists $opts{'all'}) {
1879 $opts{'maps'}[$chnum] = $opts{'all'};
1883 if ($opts{'maps'} and $self->{IMG}) {
1884 i_map($self->{IMG}, $opts{'maps'} );
1889 # destructive border - image is shrunk by one pixel all around
1892 my ($self,%opts)=@_;
1893 my($tx,$ty)=($self->getwidth()-1,$self->getheight()-1);
1894 $self->polyline('x'=>[0,$tx,$tx,0,0],'y'=>[0,0,$ty,$ty,0],%opts);
1898 # Get the width of an image
1902 if (!defined($self->{IMG})) { $self->{ERRSTR} = 'image is empty'; return undef; }
1903 return (i_img_info($self->{IMG}))[0];
1906 # Get the height of an image
1910 if (!defined($self->{IMG})) { $self->{ERRSTR} = 'image is empty'; return undef; }
1911 return (i_img_info($self->{IMG}))[1];
1914 # Get number of channels in an image
1918 if (!defined($self->{IMG})) { $self->{ERRSTR} = 'image is empty'; return undef; }
1919 return i_img_getchannels($self->{IMG});
1926 if (!defined($self->{IMG})) { $self->{ERRSTR} = 'image is empty'; return undef; }
1927 return i_img_getmask($self->{IMG});
1935 if (!defined($self->{IMG})) { $self->{ERRSTR} = 'image is empty'; return undef; }
1936 i_img_setmask( $self->{IMG} , $opts{mask} );
1939 # Get number of colors in an image
1943 my %opts=(maxcolors=>2**30,@_);
1944 if (!defined($self->{IMG})) { $self->{ERRSTR}='image is empty'; return undef; }
1945 my $rc=i_count_colors($self->{IMG},$opts{'maxcolors'});
1946 return ($rc==-1? undef : $rc);
1949 # draw string to an image
1953 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1955 my %input=('x'=>0, 'y'=>0, @_);
1956 $input{string}||=$input{text};
1958 unless(exists $input{string}) {
1959 $self->{ERRSTR}="missing required parameter 'string'";
1963 unless($input{font}) {
1964 $self->{ERRSTR}="missing required parameter 'font'";
1968 unless ($input{font}->draw(image=>$self, %input)) {
1969 $self->{ERRSTR} = $self->_error_as_msg();
1976 # Shortcuts that can be exported
1978 sub newcolor { Imager::Color->new(@_); }
1979 sub newfont { Imager::Font->new(@_); }
1981 *NC=*newcolour=*newcolor;
1988 #### Utility routines
1991 ref $_[0] ? $_[0]->{ERRSTR} : $ERRSTR
1994 # Default guess for the type of an image from extension
1996 sub def_guess_type {
1999 $ext=($name =~ m/\.([^\.]+)$/)[0];
2000 return 'tiff' if ($ext =~ m/^tiff?$/);
2001 return 'jpeg' if ($ext =~ m/^jpe?g$/);
2002 return 'pnm' if ($ext =~ m/^p[pgb]m$/);
2003 return 'png' if ($ext eq "png");
2004 return 'bmp' if ($ext eq "bmp" || $ext eq "dib");
2005 return 'gif' if ($ext eq "gif");
2009 # get the minimum of a list
2013 for(@_) { if ($_<$mx) { $mx=$_; }}
2017 # get the maximum of a list
2021 for(@_) { if ($_>$mx) { $mx=$_; }}
2025 # string stuff for iptc headers
2029 $str = substr($str,3);
2030 $str =~ s/[\n\r]//g;
2037 # A little hack to parse iptc headers.
2042 my($caption,$photogr,$headln,$credit);
2044 my $str=$self->{IPTCRAW};
2048 @ar=split(/8BIM/,$str);
2053 @sar=split(/\034\002/);
2054 foreach $item (@sar) {
2055 if ($item =~ m/^x/) {
2056 $caption=&clean($item);
2059 if ($item =~ m/^P/) {
2060 $photogr=&clean($item);
2063 if ($item =~ m/^i/) {
2064 $headln=&clean($item);
2067 if ($item =~ m/^n/) {
2068 $credit=&clean($item);
2074 return (caption=>$caption,photogr=>$photogr,headln=>$headln,credit=>$credit);
2077 # Autoload methods go after =cut, and are processed by the autosplit program.
2081 # Below is the stub of documentation for your module. You better edit it!
2085 Imager - Perl extension for Generating 24 bit Images
2089 use Imager qw(init);
2092 $img = Imager->new();
2093 $img->open(file=>'image.ppm',type=>'pnm')
2094 || print "failed: ",$img->{ERRSTR},"\n";
2095 $scaled=$img->scale(xpixels=>400,ypixels=>400);
2096 $scaled->write(file=>'sc_image.ppm',type=>'pnm')
2097 || print "failed: ",$scaled->{ERRSTR},"\n";
2101 Imager is a module for creating and altering images - It is not meant
2102 as a replacement or a competitor to ImageMagick or GD. Both are
2103 excellent packages and well supported.
2107 Almost all functions take the parameters in the hash fashion.
2110 $img->open(file=>'lena.png',type=>'png');
2114 $img->open(file=>'lena.png');
2116 =head2 Basic concept
2118 An Image object is created with C<$img = Imager-E<gt>new()> Should
2119 this fail for some reason an explanation can be found in
2120 C<$Imager::ERRSTR> usually error messages are stored in
2121 C<$img-E<gt>{ERRSTR}>, but since no object is created this is the only
2122 way to give back errors. C<$Imager::ERRSTR> is also used to report
2123 all errors not directly associated with an image object. Examples:
2125 $img=Imager->new(); # This is an empty image (size is 0 by 0)
2126 $img->open(file=>'lena.png',type=>'png'); # initializes from file
2128 or if you want to create an empty image:
2130 $img=Imager->new(xsize=>400,ysize=>300,channels=>4);
2132 This example creates a completely black image of width 400 and
2133 height 300 and 4 channels.
2135 If you have an existing image, use img_set() to change it's dimensions
2136 - this will destroy any existing image data:
2138 $img->img_set(xsize=>500, ysize=>500, channels=>4);
2140 To create paletted images, set the 'type' parameter to 'paletted':
2142 $img = Imager->new(xsize=>200, ysize=>200, channels=>3, type=>'paletted');
2144 which creates an image with a maxiumum of 256 colors, which you can
2145 change by supplying the C<maxcolors> parameter.
2147 You can create a new paletted image from an existing image using the
2148 to_paletted() method:
2150 $palimg = $img->to_paletted(\%opts)
2152 where %opts contains the options specified under L<Quantization options>.
2154 You can convert a paletted image (or any image) to an 8-bit/channel
2157 $rgbimg = $img->to_rgb8;
2159 Warning: if you draw on a paletted image with colors that aren't in
2160 the palette, the image will be internally converted to a normal image.
2162 For improved color precision you can use the bits parameter to specify
2163 16 bites per channel:
2165 $img = Imager->new(xsize=>200, ysize=>200, channels=>3, bits=>16);
2167 Note that as of this writing all functions should work on 16-bit
2168 images, but at only 8-bit/channel precision.
2170 Currently only 8 and 16/bit per channel image types are available,
2171 this may change later.
2173 Color objects are created by calling the Imager::Color->new()
2176 $color = Imager::Color->new($red, $green, $blue);
2177 $color = Imager::Color->new($red, $green, $blue, $alpha);
2178 $color = Imager::Color->new("#C0C0FF"); # html color specification
2180 This object can then be passed to functions that require a color parameter.
2182 Coordinates in Imager have the origin in the upper left corner. The
2183 horizontal coordinate increases to the right and the vertical
2186 =head2 Reading and writing images
2188 C<$img-E<gt>read()> generally takes two parameters, 'file' and 'type'.
2189 If the type of the file can be determined from the suffix of the file
2190 it can be omitted. Format dependant parameters are: For images of
2191 type 'raw' two extra parameters are needed 'xsize' and 'ysize', if the
2192 'channel' parameter is omitted for type 'raw' it is assumed to be 3.
2193 gif and png images might have a palette are converted to truecolor bit
2194 when read. Alpha channel is preserved for png images irregardless of
2195 them being in RGB or gray colorspace. Similarly grayscale jpegs are
2196 one channel images after reading them. For jpeg images the iptc
2197 header information (stored in the APP13 header) is avaliable to some
2198 degree. You can get the raw header with C<$img-E<gt>{IPTCRAW}>, but
2199 you can also retrieve the most basic information with
2200 C<%hsh=$img-E<gt>parseiptc()> as always patches are welcome. pnm has no
2201 extra options. Examples:
2203 $img = Imager->new();
2204 $img->read(file=>"cover.jpg") or die $img->errstr; # gets type from name
2206 $img = Imager->new();
2207 { local(*FH,$/); open(FH,"file.gif") or die $!; $a=<FH>; }
2208 $img->read(data=>$a,type=>'gif') or die $img->errstr;
2210 The second example shows how to read an image from a scalar, this is
2211 usefull if your data originates from somewhere else than a filesystem
2212 such as a database over a DBI connection.
2214 When writing to a tiff image file you can also specify the 'class'
2215 parameter, which can currently take a single value, "fax". If class
2216 is set to fax then a tiff image which should be suitable for faxing
2217 will be written. For the best results start with a grayscale image.
2218 By default the image is written at fine resolution you can override
2219 this by setting the "fax_fine" parameter to 0.
2221 If you are reading from a gif image file, you can supply a 'colors'
2222 parameter which must be a reference to a scalar. The referenced
2223 scalar will receive an array reference which contains the colors, each
2224 represented as an Imager::Color object.
2226 If you already have an open file handle, for example a socket or a
2227 pipe, you can specify the 'fd' parameter instead of supplying a
2228 filename. Please be aware that you need to use fileno() to retrieve
2229 the file descriptor for the file:
2231 $img->read(fd=>fileno(FILE), type=>'gif') or die $img->errstr;
2233 For writing using the 'fd' option you will probably want to set $| for
2234 that descriptor, since the writes to the file descriptor bypass Perl's
2235 (or the C libraries) buffering. Setting $| should avoid out of order
2238 *Note that load() is now an alias for read but will be removed later*
2240 C<$img-E<gt>write> has the same interface as C<read()>. The earlier
2241 comments on C<read()> for autodetecting filetypes apply. For jpegs
2242 quality can be adjusted via the 'jpegquality' parameter (0-100). The
2243 number of colorplanes in gifs are set with 'gifplanes' and should be
2244 between 1 (2 color) and 8 (256 colors). It is also possible to choose
2245 between two quantizing methods with the parameter 'gifquant'. If set
2246 to mc it uses the mediancut algorithm from either giflibrary. If set
2247 to lm it uses a local means algorithm. It is then possible to give
2248 some extra settings. lmdither is the dither deviation amount in pixels
2249 (manhattan distance). lmfixed can be an array ref who holds an array
2250 of Imager::Color objects. Note that the local means algorithm needs
2251 much more cpu time but also gives considerable better results than the
2252 median cut algorithm.
2254 Currently just for gif files, you can specify various options for the
2255 conversion from Imager's internal RGB format to the target's indexed
2256 file format. If you set the gifquant option to 'gen', you can use the
2257 options specified under L<Quantization options>.
2259 To see what Imager is compiled to support the following code snippet
2263 print "@{[keys %Imager::formats]}";
2265 When reading raw images you need to supply the width and height of the
2266 image in the xsize and ysize options:
2268 $img->read(file=>'foo.raw', xsize=>100, ysize=>100)
2269 or die "Cannot read raw image\n";
2271 If your input file has more channels than you want, or (as is common),
2272 junk in the fourth channel, you can use the datachannels and
2273 storechannels options to control the number of channels in your input
2274 file and the resulting channels in your image. For example, if your
2275 input image uses 32-bits per pixel with red, green, blue and junk
2276 values for each pixel you could do:
2278 $img->read(file=>'foo.raw', xsize=>100, ysize=>100, datachannels=>4,
2280 or die "Cannot read raw image\n";
2282 Normally the raw image is expected to have the value for channel 1
2283 immediately following channel 0 and channel 2 immediately following
2284 channel 1 for each pixel. If your input image has all the channel 0
2285 values for the first line of the image, followed by all the channel 1
2286 values for the first line and so on, you can use the interleave option:
2288 $img->read(file=>'foo.raw', xsize=100, ysize=>100, interleave=>1)
2289 or die "Cannot read raw image\n";
2291 =head2 Multi-image files
2293 Currently just for gif files, you can create files that contain more
2298 Imager->write_multi(\%opts, @images)
2300 Where %opts describes 4 possible types of outputs:
2306 This is C<gif> for gif animations.
2310 A code reference which is called with a single parameter, the data to
2311 be written. You can also specify $opts{maxbuffer} which is the
2312 maximum amount of data buffered. Note that there can be larger writes
2313 than this if the file library writes larger blocks. A smaller value
2314 maybe useful for writing to a socket for incremental display.
2318 The file descriptor to save the images to.
2322 The name of the file to write to.
2324 %opts may also include the keys from L<Gif options> and L<Quantization
2329 You must also specify the file format using the 'type' option.
2331 The current aim is to support other multiple image formats in the
2332 future, such as TIFF, and to support reading multiple images from a
2338 # ... code to put images in @images
2339 Imager->write_multi({type=>'gif',
2341 gif_delays=>[ (10) x @images ] },
2345 You can read multi-image files (currently only GIF files) using the
2346 read_multi() method:
2348 my @imgs = Imager->read_multi(file=>'foo.gif')
2349 or die "Cannot read images: ",Imager->errstr;
2351 The possible parameters for read_multi() are:
2357 The name of the file to read in.
2361 A filehandle to read in. This can be the name of a filehandle, but it
2362 will need the package name, no attempt is currently made to adjust
2363 this to the caller's package.
2367 The numeric file descriptor of an open file (or socket).
2371 A function to be called to read in data, eg. reading a blob from a
2372 database incrementally.
2376 The data of the input file in memory.
2380 The type of file. If the file is parameter is given and provides
2381 enough information to guess the type, then this parameter is optional.
2385 Note: you cannot use the callback or data parameter with giflib
2386 versions before 4.0.
2388 When reading from a GIF file with read_multi() the images are returned
2393 These options can be specified when calling write_multi() for gif
2394 files, when writing a single image with the gifquant option set to
2395 'gen', or for direct calls to i_writegif_gen and i_writegif_callback.
2397 Note that some viewers will ignore some of these options
2398 (gif_user_input in particular).
2402 =item gif_each_palette
2404 Each image in the gif file has it's own palette if this is non-zero.
2405 All but the first image has a local colour table (the first uses the
2406 global colour table.
2410 The images are written interlaced if this is non-zero.
2414 A reference to an array containing the delays between images, in 1/100
2417 If you want the same delay for every frame you can simply set this to
2418 the delay in 1/100 seconds.
2420 =item gif_user_input
2422 A reference to an array contains user input flags. If the given flag
2423 is non-zero the image viewer should wait for input before displaying
2428 A reference to an array of image disposal methods. These define what
2429 should be done to the image before displaying the next one. These are
2430 integers, where 0 means unspecified, 1 means the image should be left
2431 in place, 2 means restore to background colour and 3 means restore to
2434 =item gif_tran_color
2436 A reference to an Imager::Color object, which is the colour to use for
2437 the palette entry used to represent transparency in the palette. You
2438 need to set the transp option (see L<Quantization options>) for this
2443 A reference to an array of references to arrays which represent screen
2444 positions for each image.
2446 =item gif_loop_count
2448 If this is non-zero the Netscape loop extension block is generated,
2449 which makes the animation of the images repeat.
2451 This is currently unimplemented due to some limitations in giflib.
2455 =head2 Quantization options
2457 These options can be specified when calling write_multi() for gif
2458 files, when writing a single image with the gifquant option set to
2459 'gen', or for direct calls to i_writegif_gen and i_writegif_callback.
2465 A arrayref of colors that are fixed. Note that some color generators
2470 The type of transparency processing to perform for images with an
2471 alpha channel where the output format does not have a proper alpha
2472 channel (eg. gif). This can be any of:
2478 No transparency processing is done. (default)
2482 Pixels more transparent that tr_threshold are rendered as transparent.
2486 An error diffusion dither is done on the alpha channel. Note that
2487 this is independent of the translation performed on the colour
2488 channels, so some combinations may cause undesired artifacts.
2492 The ordered dither specified by tr_orddith is performed on the alpha
2497 This will only be used if the image has an alpha channel, and if there
2498 is space in the palette for a transparency colour.
2502 The highest alpha value at which a pixel will be made transparent when
2503 transp is 'threshold'. (0-255, default 127)
2507 The type of error diffusion to perform on the alpha channel when
2508 transp is 'errdiff'. This can be any defined error diffusion type
2509 except for custom (see errdiff below).
2513 The type of ordered dither to perform on the alpha channel when transp
2514 is 'ordered'. Possible values are:
2520 A semi-random map is used. The map is the same each time.
2532 horizontal line dither.
2536 vertical line dither.
2542 diagonal line dither
2548 diagonal line dither
2552 dot matrix dither (currently the default). This is probably the best
2553 for displays (like web pages).
2557 A custom dither matrix is used - see tr_map
2563 When tr_orddith is custom this defines an 8 x 8 matrix of integers
2564 representing the transparency threshold for pixels corresponding to
2565 each position. This should be a 64 element array where the first 8
2566 entries correspond to the first row of the matrix. Values should be
2571 Defines how the quantization engine will build the palette(s).
2572 Currently this is ignored if 'translate' is 'giflib', but that may
2573 change. Possible values are:
2579 Only colors supplied in 'colors' are used.
2583 The web color map is used (need url here.)
2587 The original code for generating the color map (Addi's code) is used.
2591 Other methods may be added in the future.
2595 A arrayref containing Imager::Color objects, which represents the
2596 starting set of colors to use in translating the images. webmap will
2597 ignore this. The final colors used are copied back into this array
2598 (which is expanded if necessary.)
2602 The maximum number of colors to use in the image.
2606 The method used to translate the RGB values in the source image into
2607 the colors selected by make_colors. Note that make_colors is ignored
2608 whene translate is 'giflib'.
2610 Possible values are:
2616 The giflib native quantization function is used.
2620 The closest color available is used.
2624 The pixel color is modified by perturb, and the closest color is chosen.
2628 An error diffusion dither is performed.
2632 It's possible other transate values will be added.
2636 The type of error diffusion dither to perform. These values (except
2637 for custom) can also be used in tr_errdif.
2643 Floyd-Steinberg dither
2647 Jarvis, Judice and Ninke dither
2655 Custom. If you use this you must also set errdiff_width,
2656 errdiff_height and errdiff_map.
2662 =item errdiff_height
2668 When translate is 'errdiff' and errdiff is 'custom' these define a
2669 custom error diffusion map. errdiff_width and errdiff_height define
2670 the size of the map in the arrayref in errdiff_map. errdiff_orig is
2671 an integer which indicates the current pixel position in the top row
2676 When translate is 'perturb' this is the magnitude of the random bias
2677 applied to each channel of the pixel before it is looked up in the
2682 =head2 Obtaining/setting attributes of images
2684 To get the size of an image in pixels the C<$img-E<gt>getwidth()> and
2685 C<$img-E<gt>getheight()> are used.
2687 To get the number of channels in
2688 an image C<$img-E<gt>getchannels()> is used. $img-E<gt>getmask() and
2689 $img-E<gt>setmask() are used to get/set the channel mask of the image.
2691 $mask=$img->getmask();
2692 $img->setmask(mask=>1+2); # modify red and green only
2693 $img->setmask(mask=>8); # modify alpha only
2694 $img->setmask(mask=>$mask); # restore previous mask
2696 The mask of an image describes which channels are updated when some
2697 operation is performed on an image. Naturally it is not possible to
2698 apply masks to operations like scaling that alter the dimensions of
2701 It is possible to have Imager find the number of colors in an image
2702 by using C<$img-E<gt>getcolorcount()>. It requires memory proportionally
2703 to the number of colors in the image so it is possible to have it
2704 stop sooner if you only need to know if there are more than a certain number
2705 of colors in the image. If there are more colors than asked for
2706 the function return undef. Examples:
2708 if (!defined($img->getcolorcount(maxcolors=>512)) {
2709 print "Less than 512 colors in image\n";
2712 The bits() method retrieves the number of bits used to represent each
2713 channel in a pixel, typically 8. The type() method returns either
2714 'direct' for truecolor images or 'paletted' for paletted images. The
2715 virtual() method returns non-zero if the image contains no actual
2716 pixels, for example masked images.
2718 =head2 Paletted Images
2720 In general you can work with paletted images in the same way as RGB
2721 images, except that if you attempt to draw to a paletted image with a
2722 color that is not in the image's palette, the image will be converted
2723 to an RGB image. This means that drawing on a paletted image with
2724 anti-aliasing enabled will almost certainly convert the image to RGB.
2726 You can add colors to a paletted image with the addcolors() method:
2728 my @colors = ( Imager::Color->new(255, 0, 0),
2729 Imager::Color->new(0, 255, 0) );
2730 my $index = $img->addcolors(colors=>\@colors);
2732 The return value is the index of the first color added, or undef if
2733 adding the colors would overflow the palette.
2735 Once you have colors in the palette you can overwrite them with the
2738 $img->setcolors(start=>$start, colors=>\@colors);
2740 Returns true on success.
2742 To retrieve existing colors from the palette use the getcolors() method:
2744 # get the whole palette
2745 my @colors = $img->getcolors();
2746 # get a single color
2747 my $color = $img->getcolors(start=>$index);
2748 # get a range of colors
2749 my @colors = $img->getcolors(start=>$index, count=>$count);
2751 To quickly find a color in the palette use findcolor():
2753 my $index = $img->findcolor(color=>$color);
2755 which returns undef on failure, or the index of the color.
2757 You can get the current palette size with $img->colorcount, and the
2758 maximum size of the palette with $img->maxcolors.
2760 =head2 Drawing Methods
2762 IMPLEMENTATION MORE OR LESS DONE CHECK THE TESTS
2763 DOCUMENTATION OF THIS SECTION OUT OF SYNC
2765 It is possible to draw with graphics primitives onto images. Such
2766 primitives include boxes, arcs, circles and lines. A reference
2767 oriented list follows.
2770 $img->box(color=>$blue,xmin=>10,ymin=>30,xmax=>200,ymax=>300,filled=>1);
2772 The above example calls the C<box> method for the image and the box
2773 covers the pixels with in the rectangle specified. If C<filled> is
2774 ommited it is drawn as an outline. If any of the edges of the box are
2775 ommited it will snap to the outer edge of the image in that direction.
2776 Also if a color is omitted a color with (255,255,255,255) is used
2780 $img->arc(color=>$red, r=20, x=>200, y=>100, d1=>10, d2=>20 );
2782 This creates a filled red arc with a 'center' at (200, 100) and spans
2783 10 degrees and the slice has a radius of 20. SEE section on BUGS.
2785 Both the arc() and box() methods can take a C<fill> parameter which
2786 can either be an Imager::Fill object, or a reference to a hash
2787 containing the parameters used to create the fill:
2789 $img->box(xmin=>10, ymin=>30, xmax=>150, ymax=>60,
2790 fill => { hatch=>'cross2' });
2792 my $fill = Imager::Fill->new(hatch=>'stipple');
2793 $img->box(fill=>$fill);
2795 See L<Imager::Fill> for the type of fills you can use.
2798 $img->circle(color=>$green, r=50, x=>200, y=>100);
2800 This creates a green circle with its center at (200, 100) and has a
2804 $img->line(color=>$green, x1=10, x2=>100,
2805 y1=>20, y2=>50, antialias=>1 );
2807 That draws an antialiased line from (10,100) to (20,50).
2810 $img->polyline(points=>[[$x0,$y0],[$x1,$y1],[$x2,$y2]],color=>$red);
2811 $img->polyline(x=>[$x0,$x1,$x2], y=>[$y0,$y1,$y2], antialias=>1);
2813 Polyline is used to draw multilple lines between a series of points.
2814 The point set can either be specified as an arrayref to an array of
2815 array references (where each such array represents a point). The
2816 other way is to specify two array references.
2818 You can fill a region that all has the same color using the
2819 flood_fill() method, for example:
2821 $img->flood_fill(x=>50, y=>50, color=>$color);
2823 will fill all regions the same color connected to the point (50, 50).
2825 You can also use a general fill, so you could fill the same region
2826 with a check pattern using:
2828 $img->flood_fill(x=>50, y=>50, fill=>{ hatch=>'check2x2' });
2830 See L<Imager::Fill> for more information on general fills.
2832 =head2 Text rendering
2834 Text rendering is described in the Imager::Font manpage.
2836 =head2 Image resizing
2838 To scale an image so porportions are maintained use the
2839 C<$img-E<gt>scale()> method. if you give either a xpixels or ypixels
2840 parameter they will determine the width or height respectively. If
2841 both are given the one resulting in a larger image is used. example:
2842 C<$img> is 700 pixels wide and 500 pixels tall.
2844 $img->scale(xpixels=>400); # 400x285
2845 $img->scale(ypixels=>400); # 560x400
2847 $img->scale(xpixels=>400,ypixels=>400); # 560x400
2848 $img->scale(xpixels=>400,ypixels=>400,type=>min); # 400x285
2850 $img->scale(scalefactor=>0.25); 175x125 $img->scale(); # 350x250
2852 if you want to create low quality previews of images you can pass
2853 C<qtype=E<gt>'preview'> to scale and it will use nearest neighbor
2854 sampling instead of filtering. It is much faster but also generates
2855 worse looking images - especially if the original has a lot of sharp
2856 variations and the scaled image is by more than 3-5 times smaller than
2859 If you need to scale images per axis it is best to do it simply by
2860 calling scaleX and scaleY. You can pass either 'scalefactor' or
2861 'pixels' to both functions.
2863 Another way to resize an image size is to crop it. The parameters
2864 to crop are the edges of the area that you want in the returned image.
2865 If a parameter is omited a default is used instead.
2867 $newimg = $img->crop(left=>50, right=>100, top=>10, bottom=>100);
2868 $newimg = $img->crop(left=>50, top=>10, width=>50, height=>90);
2869 $newimg = $img->crop(left=>50, right=>100); # top
2871 You can also specify width and height parameters which will produce a
2872 new image cropped from the center of the input image, with the given
2875 $newimg = $img->crop(width=>50, height=>50);
2877 The width and height parameters take precedence over the left/right
2878 and top/bottom parameters respectively.
2880 =head2 Copying images
2882 To create a copy of an image use the C<copy()> method. This is usefull
2883 if you want to keep an original after doing something that changes the image
2884 inplace like writing text.
2888 To copy an image to onto another image use the C<paste()> method.
2890 $dest->paste(left=>40,top=>20,img=>$logo);
2892 That copies the entire C<$logo> image onto the C<$dest> image so that the
2893 upper left corner of the C<$logo> image is at (40,20).
2896 =head2 Flipping images
2898 An inplace horizontal or vertical flip is possible by calling the
2899 C<flip()> method. If the original is to be preserved it's possible to
2900 make a copy first. The only parameter it takes is the C<dir>
2901 parameter which can take the values C<h>, C<v>, C<vh> and C<hv>.
2903 $img->flip(dir=>"h"); # horizontal flip
2904 $img->flip(dir=>"vh"); # vertical and horizontal flip
2905 $nimg = $img->copy->flip(dir=>"v"); # make a copy and flip it vertically
2907 =head2 Rotating images
2909 Use the rotate() method to rotate an image.
2911 To rotate by an exact amount in degrees or radians, use the 'degrees'
2912 or 'radians' parameter:
2914 my $rot20 = $img->rotate(degrees=>20);
2915 my $rotpi4 = $img->rotate(radians=>3.14159265/4);
2917 To rotate in steps of 90 degrees, use the 'right' parameter:
2919 my $rotated = $img->rotate(right=>270);
2921 Rotations are clockwise for positive values.
2923 =head2 Blending Images
2925 To put an image or a part of an image directly
2926 into another it is best to call the C<paste()> method on the image you
2929 $img->paste(img=>$srcimage,left=>30,top=>50);
2931 That will take paste C<$srcimage> into C<$img> with the upper
2932 left corner at (30,50). If no values are given for C<left>
2933 or C<top> they will default to 0.
2935 A more complicated way of blending images is where one image is
2936 put 'over' the other with a certain amount of opaqueness. The
2937 method that does this is rubthrough.
2939 $img->rubthrough(src=>$srcimage,tx=>30,ty=>50);
2941 That will take the image C<$srcimage> and overlay it with the upper
2942 left corner at (30,50). You can rub 2 or 4 channel images onto a 3
2943 channel image, or a 2 channel image onto a 1 channel image. The last
2944 channel is used as an alpha channel.
2949 A special image method is the filter method. An example is:
2951 $img->filter(type=>'autolevels');
2953 This will call the autolevels filter. Here is a list of the filters
2954 that are always avaliable in Imager. This list can be obtained by
2955 running the C<filterlist.perl> script that comes with the module
2959 autolevels lsat(0.1) usat(0.1) skew(0)
2960 bumpmap bump elevation(0) lightx lighty st(2)
2963 fountain xa ya xb yb ftype(linear) repeat(none) combine(0)
2964 super_sample(none) ssample_param(4) segments(see below)
2966 gradgen xo yo colors dist
2969 noise amount(3) subtype(0)
2970 postlevels levels(10)
2971 radnoise xo(100) yo(100) ascale(17.0) rscale(0.02)
2972 turbnoise xo(0.0) yo(0.0) scale(10.0)
2973 watermark wmark pixdiff(10) tx(0) ty(0)
2975 The default values are in parenthesis. All parameters must have some
2976 value but if a parameter has a default value it may be omitted when
2977 calling the filter function.
2985 scales the value of each channel so that the values in the image will
2986 cover the whole possible range for the channel. I<lsat> and I<usat>
2987 truncate the range by the specified fraction at the top and bottom of
2988 the range respectivly..
2992 uses the channel I<elevation> image I<bump> as a bumpmap on your
2993 image, with the light at (I<lightx>, I<lightty>), with a shadow length
2998 scales each channel by I<intensity>. Values of I<intensity> < 1.0
2999 will reduce the contrast.
3003 performs 2 1-dimensional convolutions on the image using the values
3004 from I<coef>. I<coef> should be have an odd length.
3008 renders a fountain fill, similar to the gradient tool in most paint
3009 software. The default fill is a linear fill from opaque black to
3010 opaque white. The points A(xa, ya) and B(xb, yb) control the way the
3011 fill is performed, depending on the ftype parameter:
3017 the fill ramps from A through to B.
3021 the fill ramps in both directions from A, where AB defines the length
3026 A is the center of a circle, and B is a point on it's circumference.
3027 The fill ramps from the center out to the circumference.
3031 A is the center of a square and B is the center of one of it's sides.
3032 This can be used to rotate the square. The fill ramps out to the
3033 edges of the square.
3037 A is the centre of a circle and B is a point on it's circumference. B
3038 marks the 0 and 360 point on the circle, with the fill ramping
3043 A is the center of a circle and B is a point on it's circumference. B
3044 marks the 0 and point on the circle, with the fill ramping in both
3045 directions to meet opposite.
3049 The I<repeat> option controls how the fill is repeated for some
3050 I<ftype>s after it leaves the AB range:
3056 no repeats, points outside of each range are treated as if they were
3057 on the extreme end of that range.
3061 the fill simply repeats in the positive direction
3065 the fill repeats in reverse and then forward and so on, in the
3070 the fill repeats in both the positive and negative directions (only
3071 meaningful for a linear fill).
3075 as for triangle, but in the negative direction too (only meaningful
3080 By default the fill simply overwrites the whole image (unless you have
3081 parts of the range 0 through 1 that aren't covered by a segment), if
3082 any segments of your fill have any transparency, you can set the
3083 I<combine> option to 1 to have the fill combined with the existing pixels.
3085 If your fill has sharp edges, for example between steps if you use
3086 repeat set to 'triangle', you may see some aliased or ragged edges.
3087 You can enable super-sampling which will take extra samples within the
3088 pixel in an attempt anti-alias the fill.
3090 The possible values for the super_sample option are:
3096 no super-sampling is done
3100 a square grid of points are sampled. The number of points sampled is
3101 the square of ceil(0.5 + sqrt(ssample_param)).
3105 a random set of points within the pixel are sampled. This looks
3106 pretty bad for low ssample_param values.
3110 the points on the radius of a circle within the pixel are sampled.
3111 This seems to produce the best results, but is fairly slow (for now).
3115 You can control the level of sampling by setting the ssample_param
3116 option. This is roughly the number of points sampled, but depends on
3117 the type of sampling.
3119 The segments option is an arrayref of segments. You really should use
3120 the Imager::Fountain class to build your fountain fill. Each segment
3121 is an array ref containing:
3127 a floating point number between 0 and 1, the start of the range of fill parameters covered by this segment.
3131 a floating point number between start and end which can be used to
3132 push the color range towards one end of the segment.
3136 a floating point number between 0 and 1, the end of the range of fill
3137 parameters covered by this segment. This should be greater than
3144 The colors at each end of the segment. These can be either
3145 Imager::Color or Imager::Color::Float objects.
3149 The type of segment, this controls the way the fill parameter varies
3150 over the segment. 0 for linear, 1 for curved (unimplemented), 2 for
3151 sine, 3 for sphere increasing, 4 for sphere decreasing.
3155 The way the color varies within the segment, 0 for simple RGB, 1 for
3156 hue increasing and 2 for hue decreasing.
3160 Don't forgot to use Imager::Fountain instead of building your own.
3161 Really. It even loads GIMP gradient files.
3165 performs a gaussian blur of the image, using I<stddev> as the standard
3166 deviation of the curve used to combine pixels, larger values give
3167 bigger blurs. For a definition of Gaussian Blur, see:
3169 http://www.maths.abdn.ac.uk/~igc/tch/mx4002/notes/node99.html
3173 renders a gradient, with the given I<colors> at the corresponding
3174 points (x,y) in I<xo> and I<yo>. You can specify the way distance is
3175 measured for color blendeing by setting I<dist> to 0 for Euclidean, 1
3176 for Euclidean squared, and 2 for Manhattan distance.
3180 inverts the image, black to white, white to black. All channels are
3181 inverted, including the alpha channel if any.
3185 produces averaged tiles of the given I<size>.
3189 adds noise of the given I<amount> to the image. If I<subtype> is
3190 zero, the noise is even to each channel, otherwise noise is added to
3191 each channel independently.
3195 renders radiant Perlin turbulent noise. The centre of the noise is at
3196 (I<xo>, I<yo>), I<ascale> controls the angular scale of the noise ,
3197 and I<rscale> the radial scale, higher numbers give more detail.
3201 alters the image to have only I<levels> distinct level in each
3206 renders Perlin turbulent noise. (I<xo>, I<yo>) controls the origin of
3207 the noise, and I<scale> the scale of the noise, with lower numbers
3212 applies I<wmark> as a watermark on the image with strength I<pixdiff>,
3213 with an origin at (I<tx>, I<ty>)
3217 A demonstration of most of the filters can be found at:
3219 http://www.develop-help.com/imager/filters.html
3221 (This is a slow link.)
3223 =head2 Color transformations
3225 You can use the convert method to transform the color space of an
3226 image using a matrix. For ease of use some presets are provided.
3228 The convert method can be used to:
3234 convert an RGB or RGBA image to grayscale.
3238 convert a grayscale image to RGB.
3242 extract a single channel from an image.
3246 set a given channel to a particular value (or from another channel)
3250 The currently defined presets are:
3258 converts an RGBA image into a grayscale image with alpha channel, or
3259 an RGB image into a grayscale image without an alpha channel.
3261 This weights the RGB channels at 22.2%, 70.7% and 7.1% respectively.
3265 removes the alpha channel from a 2 or 4 channel image. An identity
3272 extracts the first channel of the image into a single channel image
3278 extracts the second channel of the image into a single channel image
3284 extracts the third channel of the image into a single channel image
3288 extracts the alpha channel of the image into a single channel image.
3290 If the image has 1 or 3 channels (assumed to be grayscale of RGB) then
3291 the resulting image will be all white.
3295 converts a grayscale image to RGB, preserving the alpha channel if any
3299 adds an alpha channel to a grayscale or RGB image. Preserves an
3300 existing alpha channel for a 2 or 4 channel image.
3304 For example, to convert an RGB image into a greyscale image:
3306 $new = $img->convert(preset=>'grey'); # or gray
3308 or to convert a grayscale image to an RGB image:
3310 $new = $img->convert(preset=>'rgb');
3312 The presets aren't necessary simple constants in the code, some are
3313 generated based on the number of channels in the input image.
3315 If you want to perform some other colour transformation, you can use
3316 the 'matrix' parameter.
3318 For each output pixel the following matrix multiplication is done:
3320 channel[0] [ [ $c00, $c01, ... ] inchannel[0]
3321 [ ... ] = ... x [ ... ]
3322 channel[n-1] [ $cn0, ..., $cnn ] ] inchannel[max]
3325 So if you want to swap the red and green channels on a 3 channel image:
3327 $new = $img->convert(matrix=>[ [ 0, 1, 0 ],
3331 or to convert a 3 channel image to greyscale using equal weightings:
3333 $new = $img->convert(matrix=>[ [ 0.333, 0.333, 0.334 ] ])
3335 =head2 Color Mappings
3337 You can use the map method to map the values of each channel of an
3338 image independently using a list of lookup tables. It's important to
3339 realize that the modification is made inplace. The function simply
3340 returns the input image again or undef on failure.
3342 Each channel is mapped independently through a lookup table with 256
3343 entries. The elements in the table should not be less than 0 and not
3344 greater than 255. If they are out of the 0..255 range they are
3345 clamped to the range. If a table does not contain 256 entries it is
3348 Single channels can mapped by specifying their name and the mapping
3349 table. The channel names are C<red>, C<green>, C<blue>, C<alpha>.
3351 @map = map { int( $_/2 } 0..255;
3352 $img->map( red=>\@map );
3354 It is also possible to specify a single map that is applied to all
3355 channels, alpha channel included. For example this applies a gamma
3356 correction with a gamma of 1.4 to the input image.
3359 @map = map { int( 0.5 + 255*($_/255)**$gamma ) } 0..255;
3360 $img->map(all=> \@map);
3362 The C<all> map is used as a default channel, if no other map is
3363 specified for a channel then the C<all> map is used instead. If we
3364 had not wanted to apply gamma to the alpha channel we would have used:
3366 $img->map(all=> \@map, alpha=>[]);
3368 Since C<[]> contains fewer than 256 element the gamma channel is
3371 It is also possible to simply specify an array of maps that are
3372 applied to the images in the rgba order. For example to apply
3373 maps to the C<red> and C<blue> channels one would use:
3375 $img->map(maps=>[\@redmap, [], \@bluemap]);
3379 =head2 Transformations
3381 Another special image method is transform. It can be used to generate
3382 warps and rotations and such features. It can be given the operations
3383 in postfix notation or the module Affix::Infix2Postfix can be used.
3384 Look in the test case t/t55trans.t for an example.
3386 transform() needs expressions (or opcodes) that determine the source
3387 pixel for each target pixel. Source expressions are infix expressions
3388 using any of the +, -, *, / or ** binary operators, the - unary
3389 operator, ( and ) for grouping and the sin() and cos() functions. The
3390 target pixel is input as the variables x and y.
3392 You specify the x and y expressions as xexpr and yexpr respectively.
3393 You can also specify opcodes directly, but that's magic deep enough
3394 that you can look at the source code.
3396 You can still use the transform() function, but the transform2()
3397 function is just as fast and is more likely to be enhanced and
3400 Later versions of Imager also support a transform2() class method
3401 which allows you perform a more general set of operations, rather than
3402 just specifying a spatial transformation as with the transform()
3403 method, you can also perform colour transformations, image synthesis
3404 and image combinations.
3406 transform2() takes an reference to an options hash, and a list of
3407 images to operate one (this list may be empty):
3412 my $img = Imager::transform2(\%opts, @imgs)
3413 or die "transform2 failed: $Imager::ERRSTR";
3415 The options hash may define a transformation function, and optionally:
3421 width - the width of the image in pixels. If this isn't supplied the
3422 width of the first input image is used. If there are no input images
3427 height - the height of the image in pixels. If this isn't supplied
3428 the height of the first input image is used. If there are no input
3429 images an error occurs.
3433 constants - a reference to hash of constants to define for the
3434 expression engine. Some extra constants are defined by Imager
3438 The tranformation function is specified using either the expr or
3439 rpnexpr member of the options.
3443 =item Infix expressions
3445 You can supply infix expressions to transform 2 with the expr keyword.
3447 $opts{expr} = 'return getp1(w-x, h-y)'
3449 The 'expression' supplied follows this general grammar:
3451 ( identifier '=' expr ';' )* 'return' expr
3453 This allows you to simplify your expressions using variables.
3455 A more complex example might be:
3457 $opts{expr} = 'pix = getp1(x,y); return if(value(pix)>0.8,pix*0.8,pix)'
3459 Currently to use infix expressions you must have the Parse::RecDescent
3460 module installed (available from CPAN). There is also what might be a
3461 significant delay the first time you run the infix expression parser
3462 due to the compilation of the expression grammar.
3464 =item Postfix expressions
3466 You can supply postfix or reverse-polish notation expressions to
3467 transform2() through the rpnexpr keyword.
3469 The parser for rpnexpr emulates a stack machine, so operators will
3470 expect to see their parameters on top of the stack. A stack machine
3471 isn't actually used during the image transformation itself.
3473 You can store the value at the top of the stack in a variable called
3474 foo using !foo and retrieve that value again using @foo. The !foo
3475 notation will pop the value from the stack.
3477 An example equivalent to the infix expression above:
3479 $opts{rpnexpr} = 'x y getp1 !pix @pix value 0.8 gt @pix 0.8 * @pix ifp'
3483 transform2() has a fairly rich range of operators.
3487 =item +, *, -, /, %, **
3489 multiplication, addition, subtraction, division, remainder and
3490 exponentiation. Multiplication, addition and subtraction can be used
3491 on colour values too - though you need to be careful - adding 2 white
3492 values together and multiplying by 0.5 will give you grey, not white.
3494 Division by zero (or a small number) just results in a large number.
3495 Modulo zero (or a small number) results in zero.
3497 =item sin(N), cos(N), atan2(y,x)
3499 Some basic trig functions. They work in radians, so you can't just
3502 =item distance(x1, y1, x2, y2)
3504 Find the distance between two points. This is handy (along with
3505 atan2()) for producing circular effects.
3509 Find the square root. I haven't had much use for this since adding
3510 the distance() function.
3514 Find the absolute value.
3516 =item getp1(x,y), getp2(x,y), getp3(x, y)
3518 Get the pixel at position (x,y) from the first, second or third image
3519 respectively. I may add a getpn() function at some point, but this
3520 prevents static checking of the instructions against the number of
3521 images actually passed in.
3523 =item value(c), hue(c), sat(c), hsv(h,s,v)
3525 Separates a colour value into it's value (brightness), hue (colour)
3526 and saturation elements. Use hsv() to put them back together (after
3527 suitable manipulation).
3529 =item red(c), green(c), blue(c), rgb(r,g,b)
3531 Separates a colour value into it's red, green and blue colours. Use
3532 rgb(r,g,b) to put it back together.
3536 Convert a value to an integer. Uses a C int cast, so it may break on
3539 =item if(cond,ntrue,nfalse), if(cond,ctrue,cfalse)
3541 A simple (and inefficient) if function.
3543 =item <=,<,==,>=,>,!=
3545 Relational operators (typically used with if()). Since we're working
3546 with floating point values the equalities are 'near equalities' - an
3547 epsilon value is used.
3549 =item &&, ||, not(n)
3551 Basic logical operators.
3559 =item rpnexpr=>'x 25 % 15 * y 35 % 10 * getp1 !pat x y getp1 !pix @pix sat 0.7 gt @pat @pix ifp'
3561 tiles a smaller version of the input image over itself where the
3562 colour has a saturation over 0.7.
3564 =item rpnexpr=>'x 25 % 15 * y 35 % 10 * getp1 !pat y 360 / !rat x y getp1 1 @rat - pmult @pat @rat pmult padd'
3566 tiles the input image over itself so that at the top of the image the
3567 full-size image is at full strength and at the bottom the tiling is
3570 =item rpnexpr=>'x y getp1 !pix @pix value 0.96 gt @pix sat 0.1 lt and 128 128 255 rgb @pix ifp'
3572 replace pixels that are white or almost white with a palish blue
3574 =item rpnexpr=>'x 35 % 10 * y 45 % 8 * getp1 !pat x y getp1 !pix @pix sat 0.2 lt @pix value 0.9 gt and @pix @pat @pix value 2 / 0.5 + pmult ifp'
3576 Tiles the input image overitself where the image isn't white or almost
3579 =item rpnexpr=>'x y 160 180 distance !d y 180 - x 160 - atan2 !a @d 10 / @a + 3.1416 2 * % !a2 @a2 180 * 3.1416 / 1 @a2 sin 1 + 2 / hsv'
3583 =item rpnexpr=>'x y 160 180 distance !d y 180 - x 160 - atan2 !a @d 10 / @a + 3.1416 2 * % !a2 @a 180 * 3.1416 / 1 @a2 sin 1 + 2 / hsv'
3585 A spiral built on top of a colour wheel.
3589 For details on expression parsing see L<Imager::Expr>. For details on
3590 the virtual machine used to transform the images, see
3591 L<Imager::regmach.pod>.
3593 =head2 Matrix Transformations
3595 Rather than having to write code in a little language, you can use a
3596 matrix to perform transformations, using the matrix_transform()
3599 my $im2 = $im->matrix_transform(matrix=>[ -1, 0, $im->getwidth-1,
3603 By default the output image will be the same size as the input image,
3604 but you can supply the xsize and ysize parameters to change the size.
3606 Rather than building matrices by hand you can use the Imager::Matrix2d
3607 module to build the matrices. This class has methods to allow you to
3608 scale, shear, rotate, translate and reflect, and you can combine these
3609 with an overloaded multiplication operator.
3611 WARNING: the matrix you provide in the matrix operator transforms the
3612 co-ordinates within the B<destination> image to the co-ordinates
3613 within the I<source> image. This can be confusing.
3615 Since Imager has 3 different fairly general ways of transforming an
3616 image spatially, this method also has a yatf() alias. Yet Another
3617 Transformation Function.
3619 =head2 Masked Images
3621 Masked images let you control which pixels are modified in an
3622 underlying image. Where the first channel is completely black in the
3623 mask image, writes to the underlying image are ignored.
3625 For example, given a base image called $img:
3627 my $mask = Imager->new(xsize=>$img->getwidth, ysize=>getheight,
3629 # ... draw something on the mask
3630 my $maskedimg = $img->masked(mask=>$mask);
3632 You can specifiy the region of the underlying image that is masked
3633 using the left, top, right and bottom options.
3635 If you just want a subset of the image, without masking, just specify
3636 the region without specifying a mask.
3640 It is possible to add filters to the module without recompiling the
3641 module itself. This is done by using DSOs (Dynamic shared object)
3642 avaliable on most systems. This way you can maintain our own filters
3643 and not have to get me to add it, or worse patch every new version of
3644 the Module. Modules can be loaded AND UNLOADED at runtime. This
3645 means that you can have a server/daemon thingy that can do something
3648 load_plugin("dynfilt/dyntest.so") || die "unable to load plugin\n";
3649 %hsh=(a=>35,b=>200,type=>lin_stretch);
3651 unload_plugin("dynfilt/dyntest.so") || die "unable to load plugin\n";
3652 $img->write(type=>'pnm',file=>'testout/t60.jpg')
3653 || die "error in write()\n";
3655 Someone decides that the filter is not working as it should -
3656 dyntest.c modified and recompiled.
3658 load_plugin("dynfilt/dyntest.so") || die "unable to load plugin\n";
3661 An example plugin comes with the module - Please send feedback to
3662 addi@umich.edu if you test this.
3664 Note: This seems to test ok on the following systems:
3665 Linux, Solaris, HPUX, OpenBSD, FreeBSD, TRU64/OSF1, AIX.
3666 If you test this on other systems please let me know.
3670 Image tags contain meta-data about the image, ie. information not
3671 stored as pixels of the image.
3673 At the perl level each tag has a name or code and a value, which is an
3674 integer or an arbitrary string. An image can contain more than one
3675 tag with the same name or code.
3677 You can retrieve tags from an image using the tags() method, you can
3678 get all of the tags in an image, as a list of array references, with
3679 the code or name of the tag followed by the value of the tag:
3681 my @alltags = $img->tags;
3683 or you can get all tags that have a given name:
3685 my @namedtags = $img->tags(name=>$name);
3689 my @tags = $img->tags(code=>$code);
3691 You can add tags using the addtag() method, either by name:
3693 my $index = $img->addtag(name=>$name, value=>$value);
3697 my $index = $img->addtag(code=>$code, value=>$value);
3699 You can remove tags with the deltag() method, either by index:
3701 $img->deltag(index=>$index);
3705 $img->deltag(name=>$name);
3709 $img->deltag(code=>$code);
3711 In each case deltag() returns the number of tags deleted.
3713 When you read a GIF image using read_multi(), each image can include
3720 the offset of the image from the left of the "screen" ("Image Left
3725 the offset of the image from the top of the "screen" ("Image Top Position")
3729 non-zero if the image was interlaced ("Interlace Flag")
3731 =item gif_screen_width
3733 =item gif_screen_height
3735 the size of the logical screen ("Logical Screen Width",
3736 "Logical Screen Height")
3740 Non-zero if this image had a local color map.
3742 =item gif_background
3744 The index in the global colormap of the logical screen's background
3745 color. This is only set if the current image uses the global
3748 =item gif_trans_index
3750 The index of the color in the colormap used for transparency. If the
3751 image has a transparency then it is returned as a 4 channel image with
3752 the alpha set to zero in this palette entry. ("Transparent Color Index")
3756 The delay until the next frame is displayed, in 1/100 of a second.
3759 =item gif_user_input
3761 whether or not a user input is expected before continuing (view dependent)
3762 ("User Input Flag").
3766 how the next frame is displayed ("Disposal Method")
3770 the number of loops from the Netscape Loop extension. This may be zero.
3774 the first block of the first gif comment before each image.
3778 Where applicable, the ("name") is the name of that field from the GIF89
3781 The following tags are set in a TIFF image when read, and can be set
3786 =item tiff_resolutionunit
3788 The value of the ResolutionUnit tag. This is ignored on writing if
3789 the i_aspect_only tag is non-zero.
3793 The following tags are set when reading a Windows BMP file is read:
3797 =item bmp_compression
3799 The type of compression, if any.
3801 =item bmp_important_colors
3803 The number of important colors as defined by the writer of the image.
3807 Some standard tags will be implemented as time goes by:
3815 The spatial resolution of the image in pixels per inch. If the image
3816 format uses a different scale, eg. pixels per meter, then this value
3817 is converted. A floating point number stored as a string.
3821 If this is non-zero then the values in i_xres and i_yres are treated
3822 as a ratio only. If the image format does not support aspect ratios
3823 then this is scaled so the smaller value is 72dpi.
3829 box, arc, circle do not support antialiasing yet. arc, is only filled
3830 as of yet. Some routines do not return $self where they should. This
3831 affects code like this, C<$img-E<gt>box()-E<gt>arc()> where an object
3834 When saving Gif images the program does NOT try to shave of extra
3835 colors if it is possible. If you specify 128 colors and there are
3836 only 2 colors used - it will have a 128 colortable anyway.
3840 Arnar M. Hrafnkelsson, addi@umich.edu, and recently lots of assistance
3841 from Tony Cook. See the README for a complete list.
3845 perl(1), Imager::Color(3), Imager::Font(3), Imager::Matrix2d(3),
3846 Affix::Infix2Postfix(3), Parse::RecDescent(3)
3847 http://www.eecs.umich.edu/~addi/perl/Imager/