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,
296 multiply => 2, mult => 2,
299 subtract => 5, sub => 5,
309 defaults => { ftype => 0, repeat => 0, combine => 0,
310 super_sample => 0, ssample_param => 4,
313 Imager::Color->new(0,0,0),
314 Imager::Color->new(255, 255, 255),
322 i_fountain($hsh{image}, $hsh{xa}, $hsh{ya}, $hsh{xb}, $hsh{yb},
323 $hsh{ftype}, $hsh{repeat}, $hsh{combine}, $hsh{super_sample},
324 $hsh{ssample_param}, $hsh{segments});
328 $FORMATGUESS=\&def_guess_type;
336 # NOTE: this might be moved to an import override later on
340 # (look through @_ for special tags, process, and remove them);
342 # print Dumper($pack);
347 my %parms=(loglevel=>1,@_);
349 init_log($parms{'log'},$parms{'loglevel'});
352 # if ($parms{T1LIB_CONFIG}) { $ENV{T1LIB_CONFIG}=$parms{T1LIB_CONFIG}; }
353 # if ( $ENV{T1LIB_CONFIG} and ( $fontstate eq 'missing conf' )) {
361 print "shutdown code\n";
362 # for(keys %instances) { $instances{$_}->DESTROY(); }
363 malloc_state(); # how do decide if this should be used? -- store something from the import
364 print "Imager exiting\n";
368 # Load a filter plugin
373 my ($DSO_handle,$str)=DSO_open($filename);
374 if (!defined($DSO_handle)) { $Imager::ERRSTR="Couldn't load plugin '$filename'\n"; return undef; }
375 my %funcs=DSO_funclist($DSO_handle);
376 if ($DEBUG) { print "loading module $filename\n"; $i=0; for(keys %funcs) { printf(" %2d: %s\n",$i++,$_); } }
378 for(keys %funcs) { if ($filters{$_}) { $ERRSTR="filter '$_' already exists\n"; DSO_close($DSO_handle); return undef; } }
380 $DSOs{$filename}=[$DSO_handle,\%funcs];
383 my $evstr="\$filters{'".$_."'}={".$funcs{$_}.'};';
384 $DEBUG && print "eval string:\n",$evstr,"\n";
396 if (!$DSOs{$filename}) { $ERRSTR="plugin '$filename' not loaded."; return undef; }
397 my ($DSO_handle,$funcref)=@{$DSOs{$filename}};
398 for(keys %{$funcref}) {
400 $DEBUG && print "unloading: $_\n";
402 my $rc=DSO_close($DSO_handle);
403 if (!defined($rc)) { $ERRSTR="unable to unload plugin '$filename'."; return undef; }
407 # take the results of i_error() and make a message out of it
409 return join(": ", map $_->[0], i_errors());
413 # Methods to be called on objects.
416 # Create a new Imager object takes very few parameters.
417 # usually you call this method and then call open from
418 # the resulting object
425 $self->{IMG}=undef; # Just to indicate what exists
426 $self->{ERRSTR}=undef; #
427 $self->{DEBUG}=$DEBUG;
428 $self->{DEBUG} && print "Initialized Imager\n";
429 if ($hsh{xsize} && $hsh{ysize}) { $self->img_set(%hsh); }
433 # Copy an entire image with no changes
434 # - if an image has magic the copy of it will not be magical
438 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
440 my $newcopy=Imager->new();
441 $newcopy->{IMG}=i_img_new();
442 i_copy($newcopy->{IMG},$self->{IMG});
450 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
451 my %input=(left=>0, top=>0, @_);
452 unless($input{img}) {
453 $self->{ERRSTR}="no source image";
456 $input{left}=0 if $input{left} <= 0;
457 $input{top}=0 if $input{top} <= 0;
459 my($r,$b)=i_img_info($src->{IMG});
461 i_copyto($self->{IMG}, $src->{IMG},
462 0,0, $r, $b, $input{left}, $input{top});
463 return $self; # What should go here??
466 # Crop an image - i.e. return a new image that is smaller
470 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
471 my %hsh=(left=>0,right=>0,top=>0,bottom=>0,@_);
473 my ($w,$h,$l,$r,$b,$t)=($self->getwidth(),$self->getheight(),
474 @hsh{qw(left right bottom top)});
475 $l=0 if not defined $l;
476 $t=0 if not defined $t;
478 $r||=$l+delete $hsh{'width'} if defined $l and exists $hsh{'width'};
479 $b||=$t+delete $hsh{'height'} if defined $t and exists $hsh{'height'};
480 $l||=$r-delete $hsh{'width'} if defined $r and exists $hsh{'width'};
481 $t||=$b-delete $hsh{'height'} if defined $b and exists $hsh{'height'};
483 $r=$self->getwidth if not defined $r;
484 $b=$self->getheight if not defined $b;
486 ($l,$r)=($r,$l) if $l>$r;
487 ($t,$b)=($b,$t) if $t>$b;
490 $l=int(0.5+($w-$hsh{'width'})/2);
495 if ($hsh{'height'}) {
496 $b=int(0.5+($h-$hsh{'height'})/2);
497 $t=$h+$hsh{'height'};
499 $hsh{'height'}=$b-$t;
502 # print "l=$l, r=$r, h=$hsh{'width'}\n";
503 # print "t=$t, b=$b, w=$hsh{'height'}\n";
505 my $dst=Imager->new(xsize=>$hsh{'width'}, ysize=>$hsh{'height'}, channels=>$self->getchannels());
507 i_copyto($dst->{IMG},$self->{IMG},$l,$t,$r,$b,0,0);
511 # Sets an image to a certain size and channel number
512 # if there was previously data in the image it is discarded
517 my %hsh=(xsize=>100, ysize=>100, channels=>3, bits=>8, type=>'direct', @_);
519 if (defined($self->{IMG})) {
520 # let IIM_DESTROY destroy it, it's possible this image is
521 # referenced from a virtual image (like masked)
522 #i_img_destroy($self->{IMG});
526 if ($hsh{type} eq 'paletted' || $hsh{type} eq 'pseudo') {
527 $self->{IMG} = i_img_pal_new($hsh{xsize}, $hsh{ysize}, $hsh{channels},
528 $hsh{maxcolors} || 256);
530 elsif ($hsh{bits} == 16) {
531 $self->{IMG} = i_img_16_new($hsh{xsize}, $hsh{ysize}, $hsh{channels});
534 $self->{IMG}=Imager::ImgRaw::new($hsh{'xsize'}, $hsh{'ysize'},
539 # created a masked version of the current image
543 $self or return undef;
544 my %opts = (left => 0,
546 right => $self->getwidth,
547 bottom => $self->getheight,
549 my $mask = $opts{mask} ? $opts{mask}{IMG} : undef;
551 my $result = Imager->new;
552 $result->{IMG} = i_img_masked_new($self->{IMG}, $mask, $opts{left},
553 $opts{top}, $opts{right} - $opts{left},
554 $opts{bottom} - $opts{top});
555 # keep references to the mask and base images so they don't
557 $result->{DEPENDS} = [ $self->{IMG}, $mask ];
562 # convert an RGB image into a paletted image
566 if (@_ != 1 && !ref $_[0]) {
573 my $result = Imager->new;
574 $result->{IMG} = i_img_to_pal($self->{IMG}, $opts);
576 #print "Type ", i_img_type($result->{IMG}), "\n";
578 $result->{IMG} or undef $result;
583 # convert a paletted (or any image) to an 8-bit/channel RGB images
589 $result = Imager->new;
590 $result->{IMG} = i_img_to_rgb($self->{IMG})
599 my %opts = (colors=>[], @_);
601 @{$opts{colors}} or return undef;
603 $self->{IMG} and i_addcolors($self->{IMG}, @{$opts{colors}});
608 my %opts = (start=>0, colors=>[], @_);
609 @{$opts{colors}} or return undef;
611 $self->{IMG} and i_setcolors($self->{IMG}, $opts{start}, @{$opts{colors}});
617 if (!exists $opts{start} && !exists $opts{count}) {
620 $opts{count} = $self->colorcount;
622 elsif (!exists $opts{count}) {
625 elsif (!exists $opts{start}) {
630 return i_getcolors($self->{IMG}, $opts{start}, $opts{count});
634 i_colorcount($_[0]{IMG});
638 i_maxcolors($_[0]{IMG});
644 $opts{color} or return undef;
646 $self->{IMG} and i_findcolor($self->{IMG}, $opts{color});
651 $self->{IMG} and i_img_bits($self->{IMG});
657 return i_img_type($self->{IMG}) ? "paletted" : "direct";
663 $self->{IMG} and i_img_virtual($self->{IMG});
667 my ($self, %opts) = @_;
669 $self->{IMG} or return;
671 if (defined $opts{name}) {
675 while (defined($found = i_tags_find($self->{IMG}, $opts{name}, $start))) {
676 push @result, (i_tags_get($self->{IMG}, $found))[1];
679 return wantarray ? @result : $result[0];
681 elsif (defined $opts{code}) {
685 while (defined($found = i_tags_findn($self->{IMG}, $opts{code}, $start))) {
686 push @result, (i_tags_get($self->{IMG}, $found))[1];
693 return map { [ i_tags_get($self->{IMG}, $_) ] } 0.. i_tags_count($self->{IMG})-1;
696 return i_tags_count($self->{IMG});
705 return -1 unless $self->{IMG};
707 if (defined $opts{value}) {
708 if ($opts{value} =~ /^\d+$/) {
710 return i_tags_addn($self->{IMG}, $opts{name}, 0, $opts{value});
713 return i_tags_add($self->{IMG}, $opts{name}, 0, $opts{value}, 0);
716 elsif (defined $opts{data}) {
717 # force addition as a string
718 return i_tags_add($self->{IMG}, $opts{name}, 0, $opts{data}, 0);
721 $self->{ERRSTR} = "No value supplied";
725 elsif ($opts{code}) {
726 if (defined $opts{value}) {
727 if ($opts{value} =~ /^\d+$/) {
729 return i_tags_addn($self->{IMG}, $opts{code}, 0, $opts{value});
732 return i_tags_add($self->{IMG}, $opts{code}, 0, $opts{value}, 0);
735 elsif (defined $opts{data}) {
736 # force addition as a string
737 return i_tags_add($self->{IMG}, $opts{code}, 0, $opts{data}, 0);
740 $self->{ERRSTR} = "No value supplied";
753 return 0 unless $self->{IMG};
755 if (defined $opts{index}) {
756 return i_tags_delete($self->{IMG}, $opts{index});
758 elsif (defined $opts{name}) {
759 return i_tags_delbyname($self->{IMG}, $opts{name});
761 elsif (defined $opts{code}) {
762 return i_tags_delbycode($self->{IMG}, $opts{code});
765 $self->{ERRSTR} = "Need to supply index, name, or code parameter";
770 # Read an image from file
777 if (defined($self->{IMG})) {
778 # let IIM_DESTROY do the destruction, since the image may be
779 # referenced from elsewhere
780 #i_img_destroy($self->{IMG});
784 if (!$input{fd} and !$input{file} and !$input{data}) {
785 $self->{ERRSTR}='no file, fd or data parameter'; return undef;
788 $fh = new IO::File($input{file},"r");
790 $self->{ERRSTR}='Could not open file'; return undef;
799 # FIXME: Find the format here if not specified
800 # yes the code isn't here yet - next week maybe?
801 # Next week? Are you high or something? That comment
802 # has been there for half a year dude.
803 # Look, i just work here, ok?
805 if (!$input{type} and $input{file}) {
806 $input{type}=$FORMATGUESS->($input{file});
808 if (!$formats{$input{type}}) {
809 $self->{ERRSTR}='format not supported'; return undef;
812 my %iolready=(jpeg=>1, png=>1, tiff=>1, pnm=>1, raw=>1, bmp=>1, tga=>1);
814 if ($iolready{$input{type}}) {
816 $IO = io_new_fd($fd); # sort of simple for now eh?
818 if ( $input{type} eq 'jpeg' ) {
819 ($self->{IMG},$self->{IPTCRAW})=i_readjpeg_wiol( $IO );
820 if ( !defined($self->{IMG}) ) {
821 $self->{ERRSTR}='unable to read jpeg image'; return undef;
823 $self->{DEBUG} && print "loading a jpeg file\n";
827 if ( $input{type} eq 'tiff' ) {
828 $self->{IMG}=i_readtiff_wiol( $IO, -1 ); # Fixme, check if that length parameter is ever needed
829 if ( !defined($self->{IMG}) ) {
830 $self->{ERRSTR}='unable to read tiff image'; return undef;
832 $self->{DEBUG} && print "loading a tiff file\n";
836 if ( $input{type} eq 'pnm' ) {
837 $self->{IMG}=i_readpnm_wiol( $IO, -1 ); # Fixme, check if that length parameter is ever needed
838 if ( !defined($self->{IMG}) ) {
839 $self->{ERRSTR}='unable to read pnm image: '._error_as_msg(); return undef;
841 $self->{DEBUG} && print "loading a pnm file\n";
845 if ( $input{type} eq 'png' ) {
846 $self->{IMG}=i_readpng_wiol( $IO, -1 ); # Fixme, check if that length parameter is ever needed
847 if ( !defined($self->{IMG}) ) {
848 $self->{ERRSTR}='unable to read png image';
851 $self->{DEBUG} && print "loading a png file\n";
854 if ( $input{type} eq 'bmp' ) {
855 $self->{IMG}=i_readbmp_wiol( $IO );
856 if ( !defined($self->{IMG}) ) {
857 $self->{ERRSTR}='unable to read bmp image';
860 $self->{DEBUG} && print "loading a bmp file\n";
863 if ( $input{type} eq 'tga' ) {
864 $self->{IMG}=i_readtga_wiol( $IO, -1 ); # Fixme, check if that length parameter is ever needed
865 if ( !defined($self->{IMG}) ) {
866 $self->{ERRSTR}=$self->_error_as_msg();
867 # $self->{ERRSTR}='unable to read tga image';
870 $self->{DEBUG} && print "loading a tga file\n";
873 if ( $input{type} eq 'raw' ) {
874 my %params=(datachannels=>3,storechannels=>3,interleave=>1,%input);
876 if ( !($params{xsize} && $params{ysize}) ) {
877 $self->{ERRSTR}='missing xsize or ysize parameter for raw';
881 $self->{IMG} = i_readraw_wiol( $IO,
884 $params{datachannels},
885 $params{storechannels},
886 $params{interleave});
887 if ( !defined($self->{IMG}) ) {
888 $self->{ERRSTR}='unable to read raw image';
891 $self->{DEBUG} && print "loading a raw file\n";
896 # Old code for reference while changing the new stuff
898 if (!$input{type} and $input{file}) {
899 $input{type}=$FORMATGUESS->($input{file});
903 $self->{ERRSTR}='type parameter missing and not possible to guess from extension'; return undef;
906 if (!$formats{$input{type}}) {
907 $self->{ERRSTR}='format not supported';
912 $fh = new IO::File($input{file},"r");
914 $self->{ERRSTR}='Could not open file';
925 if ( $input{type} eq 'gif' ) {
927 if ($input{colors} && !ref($input{colors})) {
928 # must be a reference to a scalar that accepts the colour map
929 $self->{ERRSTR} = "option 'colors' must be a scalar reference";
932 if (exists $input{data}) {
933 if ($input{colors}) {
934 ($self->{IMG}, $colors) = i_readgif_scalar($input{data});
936 $self->{IMG}=i_readgif_scalar($input{data});
939 if ($input{colors}) {
940 ($self->{IMG}, $colors) = i_readgif( $fd );
942 $self->{IMG} = i_readgif( $fd )
946 # we may or may not change i_readgif to return blessed objects...
947 ${ $input{colors} } = [ map { NC(@$_) } @$colors ];
949 if ( !defined($self->{IMG}) ) {
950 $self->{ERRSTR}= 'reading GIF:'._error_as_msg();
953 $self->{DEBUG} && print "loading a gif file\n";
959 # Write an image to file
962 my %input=(jpegquality=>75, gifquant=>'mc', lmdither=>6.0, lmfixed=>[],
964 my ($fh, $rc, $fd, $IO);
966 my %iolready=( tiff=>1, raw=>1, png=>1, pnm=>1, bmp=>1, jpeg=>1, tga=>1 ); # this will be SO MUCH BETTER once they are all in there
968 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
970 if (!$input{file} and !$input{'fd'} and !$input{'data'}) { $self->{ERRSTR}='file/fd/data parameter missing'; return undef; }
971 if (!$input{type} and $input{file}) { $input{type}=$FORMATGUESS->($input{file}); }
972 if (!$input{type}) { $self->{ERRSTR}='type parameter missing and not possible to guess from extension'; return undef; }
974 if (!$formats{$input{type}}) { $self->{ERRSTR}='format not supported'; return undef; }
976 if (exists $input{'fd'}) {
978 } elsif (exists $input{'data'}) {
979 $IO = Imager::io_new_bufchain();
981 $fh = new IO::File($input{file},"w+");
982 if (!defined $fh) { $self->{ERRSTR}='Could not open file'; return undef; }
987 if ($iolready{$input{type}}) {
989 $IO = io_new_fd($fd);
992 if ($input{type} eq 'tiff') {
993 if (defined $input{class} && $input{class} eq 'fax') {
994 if (!i_writetiff_wiol_faxable($self->{IMG}, $IO, $input{fax_fine})) {
995 $self->{ERRSTR}='Could not write to buffer';
999 if (!i_writetiff_wiol($self->{IMG}, $IO)) {
1000 $self->{ERRSTR}='Could not write to buffer';
1004 } elsif ( $input{type} eq 'pnm' ) {
1005 if ( ! i_writeppm_wiol($self->{IMG},$IO) ) {
1006 $self->{ERRSTR}='unable to write pnm image';
1009 $self->{DEBUG} && print "writing a pnm file\n";
1010 } elsif ( $input{type} eq 'raw' ) {
1011 if ( !i_writeraw_wiol($self->{IMG},$IO) ) {
1012 $self->{ERRSTR}='unable to write raw image';
1015 $self->{DEBUG} && print "writing a raw file\n";
1016 } elsif ( $input{type} eq 'png' ) {
1017 if ( !i_writepng_wiol($self->{IMG}, $IO) ) {
1018 $self->{ERRSTR}='unable to write png image';
1021 $self->{DEBUG} && print "writing a png file\n";
1022 } elsif ( $input{type} eq 'jpeg' ) {
1023 if ( !i_writejpeg_wiol($self->{IMG}, $IO, $input{jpegquality})) {
1024 $self->{ERRSTR} = $self->_error_as_msg();
1027 $self->{DEBUG} && print "writing a jpeg file\n";
1028 } elsif ( $input{type} eq 'bmp' ) {
1029 if ( !i_writebmp_wiol($self->{IMG}, $IO) ) {
1030 $self->{ERRSTR}='unable to write bmp image';
1033 $self->{DEBUG} && print "writing a bmp file\n";
1034 } elsif ( $input{type} eq 'tga' ) {
1035 if ( !i_writetga_wiol($self->{IMG}, $IO) ) {
1036 $self->{ERRSTR}=$self->_error_as_msg();
1037 # $self->{ERRSTR}='unable to write tga image';
1040 $self->{DEBUG} && print "writing a tga file\n";
1043 if (exists $input{'data'}) {
1044 my $data = io_slurp($IO);
1046 $self->{ERRSTR}='Could not slurp from buffer';
1049 ${$input{data}} = $data;
1053 if ( $input{type} eq 'gif' ) {
1054 if (not $input{gifplanes}) {
1056 my $count=i_count_colors($self->{IMG}, 256);
1057 $gp=8 if $count == -1;
1058 $gp=1 if not $gp and $count <= 2;
1059 $gp=2 if not $gp and $count <= 4;
1060 $gp=3 if not $gp and $count <= 8;
1061 $gp=4 if not $gp and $count <= 16;
1062 $gp=5 if not $gp and $count <= 32;
1063 $gp=6 if not $gp and $count <= 64;
1064 $gp=7 if not $gp and $count <= 128;
1065 $input{gifplanes} = $gp || 8;
1068 if ($input{gifplanes}>8) {
1069 $input{gifplanes}=8;
1071 if ($input{gifquant} eq 'gen' || $input{callback}) {
1074 if ($input{gifquant} eq 'lm') {
1076 $input{make_colors} = 'addi';
1077 $input{translate} = 'perturb';
1078 $input{perturb} = $input{lmdither};
1079 } elsif ($input{gifquant} eq 'gen') {
1080 # just pass options through
1082 $input{make_colors} = 'webmap'; # ignored
1083 $input{translate} = 'giflib';
1086 if ($input{callback}) {
1087 defined $input{maxbuffer} or $input{maxbuffer} = -1;
1088 $rc = i_writegif_callback($input{callback}, $input{maxbuffer},
1089 \%input, $self->{IMG});
1091 $rc = i_writegif_gen($fd, \%input, $self->{IMG});
1094 } elsif ($input{gifquant} eq 'lm') {
1095 $rc=i_writegif($self->{IMG},$fd,$input{gifplanes},$input{lmdither},$input{lmfixed});
1097 $rc=i_writegifmc($self->{IMG},$fd,$input{gifplanes});
1099 if ( !defined($rc) ) {
1100 $self->{ERRSTR} = "Writing GIF file: "._error_as_msg(); return undef;
1102 $self->{DEBUG} && print "writing a gif file\n";
1110 my ($class, $opts, @images) = @_;
1112 if ($opts->{type} eq 'gif') {
1113 my $gif_delays = $opts->{gif_delays};
1114 local $opts->{gif_delays} = $gif_delays;
1115 unless (ref $opts->{gif_delays}) {
1116 # assume the caller wants the same delay for each frame
1117 $opts->{gif_delays} = [ ($gif_delays) x @images ];
1119 # translate to ImgRaw
1120 if (grep !UNIVERSAL::isa($_, 'Imager') || !$_->{IMG}, @images) {
1121 $ERRSTR = "Usage: Imager->write_multi({ options }, @images)";
1124 my @work = map $_->{IMG}, @images;
1125 if ($opts->{callback}) {
1126 # Note: you may need to fix giflib for this one to work
1127 my $maxbuffer = $opts->{maxbuffer};
1128 defined $maxbuffer or $maxbuffer = -1; # max by default
1129 return i_writegif_callback($opts->{callback}, $maxbuffer,
1133 return i_writegif_gen($opts->{fd}, $opts, @work);
1136 my $fh = IO::File->new($opts->{file}, "w+");
1138 $ERRSTR = "Error creating $opts->{file}: $!";
1142 return i_writegif_gen(fileno($fh), $opts, @work);
1146 $ERRSTR = "Sorry, write_multi doesn't support $opts->{type} yet";
1151 # read multiple images from a file
1153 my ($class, %opts) = @_;
1155 if ($opts{file} && !exists $opts{type}) {
1157 my $type = $FORMATGUESS->($opts{file});
1158 $opts{type} = $type;
1160 unless ($opts{type}) {
1161 $ERRSTR = "No type parameter supplied and it couldn't be guessed";
1167 $file = IO::File->new($opts{file}, "r");
1169 $ERRSTR = "Could not open file $opts{file}: $!";
1173 $fd = fileno($file);
1176 $fd = fileno($opts{fh});
1178 $ERRSTR = "File handle specified with fh option not open";
1185 elsif ($opts{callback} || $opts{data}) {
1189 $ERRSTR = "You need to specify one of file, fd, fh, callback or data";
1193 if ($opts{type} eq 'gif') {
1196 @imgs = i_readgif_multi($fd);
1199 if (Imager::i_giflib_version() < 4.0) {
1200 $ERRSTR = "giflib3.x does not support callbacks";
1203 if ($opts{callback}) {
1204 @imgs = i_readgif_multi_callback($opts{callback})
1207 @imgs = i_readgif_multi_scalar($opts{data});
1212 bless { IMG=>$_, DEBUG=>$DEBUG, ERRSTR=>undef }, 'Imager'
1216 $ERRSTR = _error_as_msg();
1221 $ERRSTR = "Cannot read multiple images from $opts{type} files";
1225 # Destroy an Imager object
1229 # delete $instances{$self};
1230 if (defined($self->{IMG})) {
1231 # the following is now handled by the XS DESTROY method for
1232 # Imager::ImgRaw object
1233 # Re-enabling this will break virtual images
1234 # tested for in t/t020masked.t
1235 # i_img_destroy($self->{IMG});
1236 undef($self->{IMG});
1238 # print "Destroy Called on an empty image!\n"; # why did I put this here??
1242 # Perform an inplace filter of an image
1243 # that is the image will be overwritten with the data
1249 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1251 if (!$input{type}) { $self->{ERRSTR}='type parameter missing'; return undef; }
1253 if ( (grep { $_ eq $input{type} } keys %filters) != 1) {
1254 $self->{ERRSTR}='type parameter not matching any filter'; return undef;
1257 if ($filters{$input{type}}{names}) {
1258 my $names = $filters{$input{type}}{names};
1259 for my $name (keys %$names) {
1260 if (defined $input{$name} && exists $names->{$name}{$input{$name}}) {
1261 $input{$name} = $names->{$name}{$input{$name}};
1265 if (defined($filters{$input{type}}{defaults})) {
1266 %hsh=('image',$self->{IMG},%{$filters{$input{type}}{defaults}},%input);
1268 %hsh=('image',$self->{IMG},%input);
1271 my @cs=@{$filters{$input{type}}{callseq}};
1274 if (!defined($hsh{$_})) {
1275 $self->{ERRSTR}="missing parameter '$_' for filter ".$input{type}; return undef;
1279 &{$filters{$input{type}}{callsub}}(%hsh);
1283 $self->{DEBUG} && print "callseq is: @cs\n";
1284 $self->{DEBUG} && print "matching callseq is: @b\n";
1289 # Scale an image to requested size and return the scaled version
1293 my %opts=(scalefactor=>0.5,type=>'max',qtype=>'normal',@_);
1294 my $img = Imager->new();
1295 my $tmp = Imager->new();
1297 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1299 if ($opts{xpixels} and $opts{ypixels} and $opts{type}) {
1300 my ($xpix,$ypix)=( $opts{xpixels}/$self->getwidth() , $opts{ypixels}/$self->getheight() );
1301 if ($opts{type} eq 'min') { $opts{scalefactor}=min($xpix,$ypix); }
1302 if ($opts{type} eq 'max') { $opts{scalefactor}=max($xpix,$ypix); }
1303 } elsif ($opts{xpixels}) { $opts{scalefactor}=$opts{xpixels}/$self->getwidth(); }
1304 elsif ($opts{ypixels}) { $opts{scalefactor}=$opts{ypixels}/$self->getheight(); }
1306 if ($opts{qtype} eq 'normal') {
1307 $tmp->{IMG}=i_scaleaxis($self->{IMG},$opts{scalefactor},0);
1308 if ( !defined($tmp->{IMG}) ) { $self->{ERRSTR}='unable to scale image'; return undef; }
1309 $img->{IMG}=i_scaleaxis($tmp->{IMG},$opts{scalefactor},1);
1310 if ( !defined($img->{IMG}) ) { $self->{ERRSTR}='unable to scale image'; return undef; }
1313 if ($opts{'qtype'} eq 'preview') {
1314 $img->{IMG}=i_scale_nn($self->{IMG},$opts{'scalefactor'},$opts{'scalefactor'});
1315 if ( !defined($img->{IMG}) ) { $self->{ERRSTR}='unable to scale image'; return undef; }
1318 $self->{ERRSTR}='scale: invalid value for qtype'; return undef;
1321 # Scales only along the X axis
1325 my %opts=(scalefactor=>0.5,@_);
1327 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1329 my $img = Imager->new();
1331 if ($opts{pixels}) { $opts{scalefactor}=$opts{pixels}/$self->getwidth(); }
1333 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1334 $img->{IMG}=i_scaleaxis($self->{IMG},$opts{scalefactor},0);
1336 if ( !defined($img->{IMG}) ) { $self->{ERRSTR}='unable to scale image'; return undef; }
1340 # Scales only along the Y axis
1344 my %opts=(scalefactor=>0.5,@_);
1346 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1348 my $img = Imager->new();
1350 if ($opts{pixels}) { $opts{scalefactor}=$opts{pixels}/$self->getheight(); }
1352 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1353 $img->{IMG}=i_scaleaxis($self->{IMG},$opts{scalefactor},1);
1355 if ( !defined($img->{IMG}) ) { $self->{ERRSTR}='unable to scale image'; return undef; }
1360 # Transform returns a spatial transformation of the input image
1361 # this moves pixels to a new location in the returned image.
1362 # NOTE - should make a utility function to check transforms for
1367 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1369 my (@op,@ropx,@ropy,$iop,$or,@parm,$expr,@xt,@yt,@pt,$numre);
1371 # print Dumper(\%opts);
1374 if ( $opts{'xexpr'} and $opts{'yexpr'} ) {
1376 eval ("use Affix::Infix2Postfix;");
1379 $self->{ERRSTR}='transform: expr given and Affix::Infix2Postfix is not avaliable.';
1382 $I2P=Affix::Infix2Postfix->new('ops'=>[{op=>'+',trans=>'Add'},
1383 {op=>'-',trans=>'Sub'},
1384 {op=>'*',trans=>'Mult'},
1385 {op=>'/',trans=>'Div'},
1386 {op=>'-',type=>'unary',trans=>'u-'},
1388 {op=>'func',type=>'unary'}],
1389 'grouping'=>[qw( \( \) )],
1390 'func'=>[qw( sin cos )],
1395 @xt=$I2P->translate($opts{'xexpr'});
1396 @yt=$I2P->translate($opts{'yexpr'});
1398 $numre=$I2P->{'numre'};
1401 for(@xt) { if (/$numre/) { push(@pt,$_); push(@{$opts{'xopcodes'}},'Parm',$#pt); } else { push(@{$opts{'xopcodes'}},$_); } }
1402 for(@yt) { if (/$numre/) { push(@pt,$_); push(@{$opts{'yopcodes'}},'Parm',$#pt); } else { push(@{$opts{'yopcodes'}},$_); } }
1403 @{$opts{'parm'}}=@pt;
1406 # print Dumper(\%opts);
1408 if ( !exists $opts{'xopcodes'} or @{$opts{'xopcodes'}}==0) {
1409 $self->{ERRSTR}='transform: no xopcodes given.';
1413 @op=@{$opts{'xopcodes'}};
1415 if (!defined ($OPCODES{$iop}) and ($iop !~ /^\d+$/) ) {
1416 $self->{ERRSTR}="transform: illegal opcode '$_'.";
1419 push(@ropx,(exists $OPCODES{$iop}) ? @{$OPCODES{$iop}} : $iop );
1425 if ( !exists $opts{'yopcodes'} or @{$opts{'yopcodes'}}==0) {
1426 $self->{ERRSTR}='transform: no yopcodes given.';
1430 @op=@{$opts{'yopcodes'}};
1432 if (!defined ($OPCODES{$iop}) and ($iop !~ /^\d+$/) ) {
1433 $self->{ERRSTR}="transform: illegal opcode '$_'.";
1436 push(@ropy,(exists $OPCODES{$iop}) ? @{$OPCODES{$iop}} : $iop );
1441 if ( !exists $opts{'parm'}) {
1442 $self->{ERRSTR}='transform: no parameter arg given.';
1446 # print Dumper(\@ropx);
1447 # print Dumper(\@ropy);
1448 # print Dumper(\@ropy);
1450 my $img = Imager->new();
1451 $img->{IMG}=i_transform($self->{IMG},\@ropx,\@ropy,$opts{'parm'});
1452 if ( !defined($img->{IMG}) ) { $self->{ERRSTR}='transform: failed'; return undef; }
1460 my ($opts, @imgs) = @_;
1463 # this is fairly big, delay loading it
1464 eval "use Imager::Expr";
1469 $opts->{variables} = [ qw(x y) ];
1470 my ($width, $height) = @{$opts}{qw(width height)};
1472 $width ||= $imgs[0]->getwidth();
1473 $height ||= $imgs[0]->getheight();
1475 for my $img (@imgs) {
1476 $opts->{constants}{"w$img_num"} = $img->getwidth();
1477 $opts->{constants}{"h$img_num"} = $img->getheight();
1478 $opts->{constants}{"cx$img_num"} = $img->getwidth()/2;
1479 $opts->{constants}{"cy$img_num"} = $img->getheight()/2;
1484 $opts->{constants}{w} = $width;
1485 $opts->{constants}{cx} = $width/2;
1488 $Imager::ERRSTR = "No width supplied";
1492 $opts->{constants}{h} = $height;
1493 $opts->{constants}{cy} = $height/2;
1496 $Imager::ERRSTR = "No height supplied";
1499 my $code = Imager::Expr->new($opts);
1501 $Imager::ERRSTR = Imager::Expr::error();
1505 my $img = Imager->new();
1506 $img->{IMG} = i_transform2($opts->{width}, $opts->{height}, $code->code(),
1507 $code->nregs(), $code->cregs(),
1508 [ map { $_->{IMG} } @imgs ]);
1509 if (!defined $img->{IMG}) {
1510 $Imager::ERRSTR = "transform2 failed";
1520 my %opts=(tx=>0,ty=>0,@_);
1522 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1523 unless ($opts{src} && $opts{src}->{IMG}) { $self->{ERRSTR}='empty input image for source'; return undef; }
1525 unless (i_rubthru($self->{IMG}, $opts{src}->{IMG}, $opts{tx},$opts{ty})) {
1526 $self->{ERRSTR} = $self->_error_as_msg();
1536 my %xlate = (h=>0, v=>1, hv=>2, vh=>2);
1538 return () unless defined $opts{'dir'} and defined $xlate{$opts{'dir'}};
1539 $dir = $xlate{$opts{'dir'}};
1540 return $self if i_flipxy($self->{IMG}, $dir);
1547 if (defined $opts{right}) {
1548 my $degrees = $opts{right};
1550 $degrees += 360 * int(((-$degrees)+360)/360);
1552 $degrees = $degrees % 360;
1553 if ($degrees == 0) {
1554 return $self->copy();
1556 elsif ($degrees == 90 || $degrees == 180 || $degrees == 270) {
1557 my $result = Imager->new();
1558 if ($result->{IMG} = i_rotate90($self->{IMG}, $degrees)) {
1562 $self->{ERRSTR} = $self->_error_as_msg();
1567 $self->{ERRSTR} = "Parameter 'right' must be a multiple of 90 degrees";
1571 elsif (defined $opts{radians} || defined $opts{degrees}) {
1572 my $amount = $opts{radians} || $opts{degrees} * 3.1415926535 / 180;
1574 my $result = Imager->new;
1575 if ($result->{IMG} = i_rotate_exact($self->{IMG}, $amount)) {
1579 $self->{ERRSTR} = $self->_error_as_msg();
1584 $self->{ERRSTR} = "Only the 'right' parameter is available";
1589 sub matrix_transform {
1593 if ($opts{matrix}) {
1594 my $xsize = $opts{xsize} || $self->getwidth;
1595 my $ysize = $opts{ysize} || $self->getheight;
1597 my $result = Imager->new;
1598 $result->{IMG} = i_matrix_transform($self->{IMG}, $xsize, $ysize,
1605 $self->{ERRSTR} = "matrix parameter required";
1611 *yatf = \&matrix_transform;
1613 # These two are supported for legacy code only
1616 return Imager::Color->new(@_);
1620 return Imager::Color::set(@_);
1623 # Draws a box between the specified corner points.
1626 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1627 my $dflcl=i_color_new(255,255,255,255);
1628 my %opts=(color=>$dflcl,xmin=>0,ymin=>0,xmax=>$self->getwidth()-1,ymax=>$self->getheight()-1,@_);
1630 if (exists $opts{'box'}) {
1631 $opts{'xmin'} = min($opts{'box'}->[0],$opts{'box'}->[2]);
1632 $opts{'xmax'} = max($opts{'box'}->[0],$opts{'box'}->[2]);
1633 $opts{'ymin'} = min($opts{'box'}->[1],$opts{'box'}->[3]);
1634 $opts{'ymax'} = max($opts{'box'}->[1],$opts{'box'}->[3]);
1637 if ($opts{filled}) {
1638 i_box_filled($self->{IMG},$opts{xmin},$opts{ymin},$opts{xmax},
1639 $opts{ymax},$opts{color});
1641 elsif ($opts{fill}) {
1642 unless (UNIVERSAL::isa($opts{fill}, 'Imager::Fill')) {
1643 # assume it's a hash ref
1644 require 'Imager/Fill.pm';
1645 unless ($opts{fill} = Imager::Fill->new(%{$opts{fill}})) {
1646 $self->{ERRSTR} = $Imager::ERRSTR;
1650 i_box_cfill($self->{IMG},$opts{xmin},$opts{ymin},$opts{xmax},
1651 $opts{ymax},$opts{fill}{fill});
1654 i_box($self->{IMG},$opts{xmin},$opts{ymin},$opts{xmax},$opts{ymax},$opts{color});
1659 # Draws an arc - this routine SUCKS and is buggy - it sometimes doesn't work when the arc is a convex polygon
1663 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1664 my $dflcl=i_color_new(255,255,255,255);
1665 my %opts=(color=>$dflcl,
1666 'r'=>min($self->getwidth(),$self->getheight())/3,
1667 'x'=>$self->getwidth()/2,
1668 'y'=>$self->getheight()/2,
1669 'd1'=>0, 'd2'=>361, @_);
1671 unless (UNIVERSAL::isa($opts{fill}, 'Imager::Fill')) {
1672 # assume it's a hash ref
1673 require 'Imager/Fill.pm';
1674 $opts{fill} = Imager::Fill->new(%{$opts{fill}});
1676 i_arc_cfill($self->{IMG},$opts{'x'},$opts{'y'},$opts{'r'},$opts{'d1'},
1677 $opts{'d2'}, $opts{fill}{fill});
1680 if ($opts{d1} == 0 && $opts{d2} == 361 && $opts{aa}) {
1681 i_circle_aa($self->{IMG}, $opts{'x'}, $opts{'y'}, $opts{'r'},
1685 i_arc($self->{IMG},$opts{'x'},$opts{'y'},$opts{'r'},$opts{'d1'},
1686 $opts{'d2'},$opts{'color'});
1693 # Draws a line from one point to (but not including) the destination point
1697 my $dflcl=i_color_new(0,0,0,0);
1698 my %opts=(color=>$dflcl,@_);
1699 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1701 unless (exists $opts{x1} and exists $opts{y1}) { $self->{ERRSTR}='missing begining coord'; return undef; }
1702 unless (exists $opts{x2} and exists $opts{y2}) { $self->{ERRSTR}='missing ending coord'; return undef; }
1704 if ($opts{antialias}) {
1705 i_line_aa($self->{IMG},$opts{x1}, $opts{y1}, $opts{x2}, $opts{y2}, $opts{color});
1707 i_draw($self->{IMG},$opts{x1}, $opts{y1}, $opts{x2}, $opts{y2}, $opts{color});
1712 # Draws a line between an ordered set of points - It more or less just transforms this
1713 # into a list of lines.
1717 my ($pt,$ls,@points);
1718 my $dflcl=i_color_new(0,0,0,0);
1719 my %opts=(color=>$dflcl,@_);
1721 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1723 if (exists($opts{points})) { @points=@{$opts{points}}; }
1724 if (!exists($opts{points}) and exists($opts{'x'}) and exists($opts{'y'}) ) {
1725 @points=map { [ $opts{'x'}->[$_],$opts{'y'}->[$_] ] } (0..(scalar @{$opts{'x'}}-1));
1728 # print Dumper(\@points);
1730 if ($opts{antialias}) {
1732 if (defined($ls)) { i_line_aa($self->{IMG},$ls->[0],$ls->[1],$pt->[0],$pt->[1],$opts{color}); }
1737 if (defined($ls)) { i_draw($self->{IMG},$ls->[0],$ls->[1],$pt->[0],$pt->[1],$opts{color}); }
1744 # this the multipoint bezier curve
1745 # this is here more for testing that actual usage since
1746 # this is not a good algorithm. Usually the curve would be
1747 # broken into smaller segments and each done individually.
1751 my ($pt,$ls,@points);
1752 my $dflcl=i_color_new(0,0,0,0);
1753 my %opts=(color=>$dflcl,@_);
1755 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1757 if (exists $opts{points}) {
1758 $opts{'x'}=map { $_->[0]; } @{$opts{'points'}};
1759 $opts{'y'}=map { $_->[1]; } @{$opts{'points'}};
1762 unless ( @{$opts{'x'}} and @{$opts{'x'}} == @{$opts{'y'}} ) {
1763 $self->{ERRSTR}='Missing or invalid points.';
1767 i_bezier_multi($self->{IMG},$opts{'x'},$opts{'y'},$opts{'color'});
1773 my %opts = ( color=>Imager::Color->new(255, 255, 255), @_ );
1775 unless (exists $opts{x} && exists $opts{'y'}) {
1776 $self->{ERRSTR} = "missing seed x and y parameters";
1781 unless (UNIVERSAL::isa($opts{fill}, 'Imager::Fill')) {
1782 # assume it's a hash ref
1783 require 'Imager/Fill.pm';
1784 $opts{fill} = Imager::Fill->new(%{$opts{fill}});
1786 i_flood_cfill($self->{IMG}, $opts{x}, $opts{'y'}, $opts{fill}{fill});
1789 i_flood_fill($self->{IMG}, $opts{x}, $opts{'y'}, $opts{color});
1795 # make an identity matrix of the given size
1799 my $matrix = [ map { [ (0) x $size ] } 1..$size ];
1800 for my $c (0 .. ($size-1)) {
1801 $matrix->[$c][$c] = 1;
1806 # general function to convert an image
1808 my ($self, %opts) = @_;
1811 # the user can either specify a matrix or preset
1812 # the matrix overrides the preset
1813 if (!exists($opts{matrix})) {
1814 unless (exists($opts{preset})) {
1815 $self->{ERRSTR} = "convert() needs a matrix or preset";
1819 if ($opts{preset} eq 'gray' || $opts{preset} eq 'grey') {
1820 # convert to greyscale, keeping the alpha channel if any
1821 if ($self->getchannels == 3) {
1822 $matrix = [ [ 0.222, 0.707, 0.071 ] ];
1824 elsif ($self->getchannels == 4) {
1825 # preserve the alpha channel
1826 $matrix = [ [ 0.222, 0.707, 0.071, 0 ],
1831 $matrix = _identity($self->getchannels);
1834 elsif ($opts{preset} eq 'noalpha') {
1835 # strip the alpha channel
1836 if ($self->getchannels == 2 or $self->getchannels == 4) {
1837 $matrix = _identity($self->getchannels);
1838 pop(@$matrix); # lose the alpha entry
1841 $matrix = _identity($self->getchannels);
1844 elsif ($opts{preset} eq 'red' || $opts{preset} eq 'channel0') {
1846 $matrix = [ [ 1 ] ];
1848 elsif ($opts{preset} eq 'green' || $opts{preset} eq 'channel1') {
1849 $matrix = [ [ 0, 1 ] ];
1851 elsif ($opts{preset} eq 'blue' || $opts{preset} eq 'channel2') {
1852 $matrix = [ [ 0, 0, 1 ] ];
1854 elsif ($opts{preset} eq 'alpha') {
1855 if ($self->getchannels == 2 or $self->getchannels == 4) {
1856 $matrix = [ [ (0) x ($self->getchannels-1), 1 ] ];
1859 # the alpha is just 1 <shrug>
1860 $matrix = [ [ (0) x $self->getchannels, 1 ] ];
1863 elsif ($opts{preset} eq 'rgb') {
1864 if ($self->getchannels == 1) {
1865 $matrix = [ [ 1 ], [ 1 ], [ 1 ] ];
1867 elsif ($self->getchannels == 2) {
1868 # preserve the alpha channel
1869 $matrix = [ [ 1, 0 ], [ 1, 0 ], [ 1, 0 ], [ 0, 1 ] ];
1872 $matrix = _identity($self->getchannels);
1875 elsif ($opts{preset} eq 'addalpha') {
1876 if ($self->getchannels == 1) {
1877 $matrix = _identity(2);
1879 elsif ($self->getchannels == 3) {
1880 $matrix = _identity(4);
1883 $matrix = _identity($self->getchannels);
1887 $self->{ERRSTR} = "Unknown convert preset $opts{preset}";
1893 $matrix = $opts{matrix};
1896 my $new = Imager->new();
1897 $new->{IMG} = i_img_new();
1898 unless (i_convert($new->{IMG}, $self->{IMG}, $matrix)) {
1899 # most likely a bad matrix
1900 $self->{ERRSTR} = _error_as_msg();
1907 # general function to map an image through lookup tables
1910 my ($self, %opts) = @_;
1911 my @chlist = qw( red green blue alpha );
1913 if (!exists($opts{'maps'})) {
1914 # make maps from channel maps
1916 for $chnum (0..$#chlist) {
1917 if (exists $opts{$chlist[$chnum]}) {
1918 $opts{'maps'}[$chnum] = $opts{$chlist[$chnum]};
1919 } elsif (exists $opts{'all'}) {
1920 $opts{'maps'}[$chnum] = $opts{'all'};
1924 if ($opts{'maps'} and $self->{IMG}) {
1925 i_map($self->{IMG}, $opts{'maps'} );
1930 # destructive border - image is shrunk by one pixel all around
1933 my ($self,%opts)=@_;
1934 my($tx,$ty)=($self->getwidth()-1,$self->getheight()-1);
1935 $self->polyline('x'=>[0,$tx,$tx,0,0],'y'=>[0,0,$ty,$ty,0],%opts);
1939 # Get the width of an image
1943 if (!defined($self->{IMG})) { $self->{ERRSTR} = 'image is empty'; return undef; }
1944 return (i_img_info($self->{IMG}))[0];
1947 # Get the height of an image
1951 if (!defined($self->{IMG})) { $self->{ERRSTR} = 'image is empty'; return undef; }
1952 return (i_img_info($self->{IMG}))[1];
1955 # Get number of channels in an image
1959 if (!defined($self->{IMG})) { $self->{ERRSTR} = 'image is empty'; return undef; }
1960 return i_img_getchannels($self->{IMG});
1967 if (!defined($self->{IMG})) { $self->{ERRSTR} = 'image is empty'; return undef; }
1968 return i_img_getmask($self->{IMG});
1976 if (!defined($self->{IMG})) { $self->{ERRSTR} = 'image is empty'; return undef; }
1977 i_img_setmask( $self->{IMG} , $opts{mask} );
1980 # Get number of colors in an image
1984 my %opts=(maxcolors=>2**30,@_);
1985 if (!defined($self->{IMG})) { $self->{ERRSTR}='image is empty'; return undef; }
1986 my $rc=i_count_colors($self->{IMG},$opts{'maxcolors'});
1987 return ($rc==-1? undef : $rc);
1990 # draw string to an image
1994 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1996 my %input=('x'=>0, 'y'=>0, @_);
1997 $input{string}||=$input{text};
1999 unless(exists $input{string}) {
2000 $self->{ERRSTR}="missing required parameter 'string'";
2004 unless($input{font}) {
2005 $self->{ERRSTR}="missing required parameter 'font'";
2009 unless ($input{font}->draw(image=>$self, %input)) {
2010 $self->{ERRSTR} = $self->_error_as_msg();
2017 # Shortcuts that can be exported
2019 sub newcolor { Imager::Color->new(@_); }
2020 sub newfont { Imager::Font->new(@_); }
2022 *NC=*newcolour=*newcolor;
2029 #### Utility routines
2032 ref $_[0] ? $_[0]->{ERRSTR} : $ERRSTR
2035 # Default guess for the type of an image from extension
2037 sub def_guess_type {
2040 $ext=($name =~ m/\.([^\.]+)$/)[0];
2041 return 'tiff' if ($ext =~ m/^tiff?$/);
2042 return 'jpeg' if ($ext =~ m/^jpe?g$/);
2043 return 'pnm' if ($ext =~ m/^p[pgb]m$/);
2044 return 'png' if ($ext eq "png");
2045 return 'bmp' if ($ext eq "bmp" || $ext eq "dib");
2046 return 'tga' if ($ext eq "tga");
2047 return 'gif' if ($ext eq "gif");
2051 # get the minimum of a list
2055 for(@_) { if ($_<$mx) { $mx=$_; }}
2059 # get the maximum of a list
2063 for(@_) { if ($_>$mx) { $mx=$_; }}
2067 # string stuff for iptc headers
2071 $str = substr($str,3);
2072 $str =~ s/[\n\r]//g;
2079 # A little hack to parse iptc headers.
2084 my($caption,$photogr,$headln,$credit);
2086 my $str=$self->{IPTCRAW};
2090 @ar=split(/8BIM/,$str);
2095 @sar=split(/\034\002/);
2096 foreach $item (@sar) {
2097 if ($item =~ m/^x/) {
2098 $caption=&clean($item);
2101 if ($item =~ m/^P/) {
2102 $photogr=&clean($item);
2105 if ($item =~ m/^i/) {
2106 $headln=&clean($item);
2109 if ($item =~ m/^n/) {
2110 $credit=&clean($item);
2116 return (caption=>$caption,photogr=>$photogr,headln=>$headln,credit=>$credit);
2119 # Autoload methods go after =cut, and are processed by the autosplit program.
2123 # Below is the stub of documentation for your module. You better edit it!
2127 Imager - Perl extension for Generating 24 bit Images
2131 use Imager qw(init);
2134 $img = Imager->new();
2135 $img->open(file=>'image.ppm',type=>'pnm')
2136 || print "failed: ",$img->{ERRSTR},"\n";
2137 $scaled=$img->scale(xpixels=>400,ypixels=>400);
2138 $scaled->write(file=>'sc_image.ppm',type=>'pnm')
2139 || print "failed: ",$scaled->{ERRSTR},"\n";
2143 Imager is a module for creating and altering images - It is not meant
2144 as a replacement or a competitor to ImageMagick or GD. Both are
2145 excellent packages and well supported.
2149 Almost all functions take the parameters in the hash fashion.
2152 $img->open(file=>'lena.png',type=>'png');
2156 $img->open(file=>'lena.png');
2158 =head2 Basic concept
2160 An Image object is created with C<$img = Imager-E<gt>new()> Should
2161 this fail for some reason an explanation can be found in
2162 C<$Imager::ERRSTR> usually error messages are stored in
2163 C<$img-E<gt>{ERRSTR}>, but since no object is created this is the only
2164 way to give back errors. C<$Imager::ERRSTR> is also used to report
2165 all errors not directly associated with an image object. Examples:
2167 $img=Imager->new(); # This is an empty image (size is 0 by 0)
2168 $img->open(file=>'lena.png',type=>'png'); # initializes from file
2170 or if you want to create an empty image:
2172 $img=Imager->new(xsize=>400,ysize=>300,channels=>4);
2174 This example creates a completely black image of width 400 and
2175 height 300 and 4 channels.
2177 If you have an existing image, use img_set() to change it's dimensions
2178 - this will destroy any existing image data:
2180 $img->img_set(xsize=>500, ysize=>500, channels=>4);
2182 To create paletted images, set the 'type' parameter to 'paletted':
2184 $img = Imager->new(xsize=>200, ysize=>200, channels=>3, type=>'paletted');
2186 which creates an image with a maxiumum of 256 colors, which you can
2187 change by supplying the C<maxcolors> parameter.
2189 You can create a new paletted image from an existing image using the
2190 to_paletted() method:
2192 $palimg = $img->to_paletted(\%opts)
2194 where %opts contains the options specified under L<Quantization options>.
2196 You can convert a paletted image (or any image) to an 8-bit/channel
2199 $rgbimg = $img->to_rgb8;
2201 Warning: if you draw on a paletted image with colors that aren't in
2202 the palette, the image will be internally converted to a normal image.
2204 For improved color precision you can use the bits parameter to specify
2205 16 bites per channel:
2207 $img = Imager->new(xsize=>200, ysize=>200, channels=>3, bits=>16);
2209 Note that as of this writing all functions should work on 16-bit
2210 images, but at only 8-bit/channel precision.
2212 Currently only 8 and 16/bit per channel image types are available,
2213 this may change later.
2215 Color objects are created by calling the Imager::Color->new()
2218 $color = Imager::Color->new($red, $green, $blue);
2219 $color = Imager::Color->new($red, $green, $blue, $alpha);
2220 $color = Imager::Color->new("#C0C0FF"); # html color specification
2222 This object can then be passed to functions that require a color parameter.
2224 Coordinates in Imager have the origin in the upper left corner. The
2225 horizontal coordinate increases to the right and the vertical
2228 =head2 Reading and writing images
2230 C<$img-E<gt>read()> generally takes two parameters, 'file' and 'type'.
2231 If the type of the file can be determined from the suffix of the file
2232 it can be omitted. Format dependant parameters are: For images of
2233 type 'raw' two extra parameters are needed 'xsize' and 'ysize', if the
2234 'channel' parameter is omitted for type 'raw' it is assumed to be 3.
2235 gif and png images might have a palette are converted to truecolor bit
2236 when read. Alpha channel is preserved for png images irregardless of
2237 them being in RGB or gray colorspace. Similarly grayscale jpegs are
2238 one channel images after reading them. For jpeg images the iptc
2239 header information (stored in the APP13 header) is avaliable to some
2240 degree. You can get the raw header with C<$img-E<gt>{IPTCRAW}>, but
2241 you can also retrieve the most basic information with
2242 C<%hsh=$img-E<gt>parseiptc()> as always patches are welcome. pnm has no
2243 extra options. Examples:
2245 $img = Imager->new();
2246 $img->read(file=>"cover.jpg") or die $img->errstr; # gets type from name
2248 $img = Imager->new();
2249 { local(*FH,$/); open(FH,"file.gif") or die $!; $a=<FH>; }
2250 $img->read(data=>$a,type=>'gif') or die $img->errstr;
2252 The second example shows how to read an image from a scalar, this is
2253 usefull if your data originates from somewhere else than a filesystem
2254 such as a database over a DBI connection.
2256 When writing to a tiff image file you can also specify the 'class'
2257 parameter, which can currently take a single value, "fax". If class
2258 is set to fax then a tiff image which should be suitable for faxing
2259 will be written. For the best results start with a grayscale image.
2260 By default the image is written at fine resolution you can override
2261 this by setting the "fax_fine" parameter to 0.
2263 If you are reading from a gif image file, you can supply a 'colors'
2264 parameter which must be a reference to a scalar. The referenced
2265 scalar will receive an array reference which contains the colors, each
2266 represented as an Imager::Color object.
2268 If you already have an open file handle, for example a socket or a
2269 pipe, you can specify the 'fd' parameter instead of supplying a
2270 filename. Please be aware that you need to use fileno() to retrieve
2271 the file descriptor for the file:
2273 $img->read(fd=>fileno(FILE), type=>'gif') or die $img->errstr;
2275 For writing using the 'fd' option you will probably want to set $| for
2276 that descriptor, since the writes to the file descriptor bypass Perl's
2277 (or the C libraries) buffering. Setting $| should avoid out of order
2278 output. For example a common idiom when writing a CGI script is:
2280 # the $| _must_ come before you send the content-type
2282 print "Content-Type: image/jpeg\n\n";
2283 $img->write(fd=>fileno(STDOUT), type=>'jpeg') or die $img->errstr;
2285 *Note that load() is now an alias for read but will be removed later*
2287 C<$img-E<gt>write> has the same interface as C<read()>. The earlier
2288 comments on C<read()> for autodetecting filetypes apply. For jpegs
2289 quality can be adjusted via the 'jpegquality' parameter (0-100). The
2290 number of colorplanes in gifs are set with 'gifplanes' and should be
2291 between 1 (2 color) and 8 (256 colors). It is also possible to choose
2292 between two quantizing methods with the parameter 'gifquant'. If set
2293 to mc it uses the mediancut algorithm from either giflibrary. If set
2294 to lm it uses a local means algorithm. It is then possible to give
2295 some extra settings. lmdither is the dither deviation amount in pixels
2296 (manhattan distance). lmfixed can be an array ref who holds an array
2297 of Imager::Color objects. Note that the local means algorithm needs
2298 much more cpu time but also gives considerable better results than the
2299 median cut algorithm.
2301 Currently just for gif files, you can specify various options for the
2302 conversion from Imager's internal RGB format to the target's indexed
2303 file format. If you set the gifquant option to 'gen', you can use the
2304 options specified under L<Quantization options>.
2306 To see what Imager is compiled to support the following code snippet
2310 print "@{[keys %Imager::formats]}";
2312 When reading raw images you need to supply the width and height of the
2313 image in the xsize and ysize options:
2315 $img->read(file=>'foo.raw', xsize=>100, ysize=>100)
2316 or die "Cannot read raw image\n";
2318 If your input file has more channels than you want, or (as is common),
2319 junk in the fourth channel, you can use the datachannels and
2320 storechannels options to control the number of channels in your input
2321 file and the resulting channels in your image. For example, if your
2322 input image uses 32-bits per pixel with red, green, blue and junk
2323 values for each pixel you could do:
2325 $img->read(file=>'foo.raw', xsize=>100, ysize=>100, datachannels=>4,
2327 or die "Cannot read raw image\n";
2329 Normally the raw image is expected to have the value for channel 1
2330 immediately following channel 0 and channel 2 immediately following
2331 channel 1 for each pixel. If your input image has all the channel 0
2332 values for the first line of the image, followed by all the channel 1
2333 values for the first line and so on, you can use the interleave option:
2335 $img->read(file=>'foo.raw', xsize=100, ysize=>100, interleave=>1)
2336 or die "Cannot read raw image\n";
2338 =head2 Multi-image files
2340 Currently just for gif files, you can create files that contain more
2345 Imager->write_multi(\%opts, @images)
2347 Where %opts describes 4 possible types of outputs:
2353 This is C<gif> for gif animations.
2357 A code reference which is called with a single parameter, the data to
2358 be written. You can also specify $opts{maxbuffer} which is the
2359 maximum amount of data buffered. Note that there can be larger writes
2360 than this if the file library writes larger blocks. A smaller value
2361 maybe useful for writing to a socket for incremental display.
2365 The file descriptor to save the images to.
2369 The name of the file to write to.
2371 %opts may also include the keys from L<Gif options> and L<Quantization
2376 You must also specify the file format using the 'type' option.
2378 The current aim is to support other multiple image formats in the
2379 future, such as TIFF, and to support reading multiple images from a
2385 # ... code to put images in @images
2386 Imager->write_multi({type=>'gif',
2388 gif_delays=>[ (10) x @images ] },
2392 You can read multi-image files (currently only GIF files) using the
2393 read_multi() method:
2395 my @imgs = Imager->read_multi(file=>'foo.gif')
2396 or die "Cannot read images: ",Imager->errstr;
2398 The possible parameters for read_multi() are:
2404 The name of the file to read in.
2408 A filehandle to read in. This can be the name of a filehandle, but it
2409 will need the package name, no attempt is currently made to adjust
2410 this to the caller's package.
2414 The numeric file descriptor of an open file (or socket).
2418 A function to be called to read in data, eg. reading a blob from a
2419 database incrementally.
2423 The data of the input file in memory.
2427 The type of file. If the file is parameter is given and provides
2428 enough information to guess the type, then this parameter is optional.
2432 Note: you cannot use the callback or data parameter with giflib
2433 versions before 4.0.
2435 When reading from a GIF file with read_multi() the images are returned
2440 These options can be specified when calling write_multi() for gif
2441 files, when writing a single image with the gifquant option set to
2442 'gen', or for direct calls to i_writegif_gen and i_writegif_callback.
2444 Note that some viewers will ignore some of these options
2445 (gif_user_input in particular).
2449 =item gif_each_palette
2451 Each image in the gif file has it's own palette if this is non-zero.
2452 All but the first image has a local colour table (the first uses the
2453 global colour table.
2457 The images are written interlaced if this is non-zero.
2461 A reference to an array containing the delays between images, in 1/100
2464 If you want the same delay for every frame you can simply set this to
2465 the delay in 1/100 seconds.
2467 =item gif_user_input
2469 A reference to an array contains user input flags. If the given flag
2470 is non-zero the image viewer should wait for input before displaying
2475 A reference to an array of image disposal methods. These define what
2476 should be done to the image before displaying the next one. These are
2477 integers, where 0 means unspecified, 1 means the image should be left
2478 in place, 2 means restore to background colour and 3 means restore to
2481 =item gif_tran_color
2483 A reference to an Imager::Color object, which is the colour to use for
2484 the palette entry used to represent transparency in the palette. You
2485 need to set the transp option (see L<Quantization options>) for this
2490 A reference to an array of references to arrays which represent screen
2491 positions for each image.
2493 =item gif_loop_count
2495 If this is non-zero the Netscape loop extension block is generated,
2496 which makes the animation of the images repeat.
2498 This is currently unimplemented due to some limitations in giflib.
2500 =item gif_eliminate_unused
2502 If this is true, when you write a paletted image any unused colors
2503 will be eliminated from its palette. This is set by default.
2507 =head2 Quantization options
2509 These options can be specified when calling write_multi() for gif
2510 files, when writing a single image with the gifquant option set to
2511 'gen', or for direct calls to i_writegif_gen and i_writegif_callback.
2517 A arrayref of colors that are fixed. Note that some color generators
2522 The type of transparency processing to perform for images with an
2523 alpha channel where the output format does not have a proper alpha
2524 channel (eg. gif). This can be any of:
2530 No transparency processing is done. (default)
2534 Pixels more transparent that tr_threshold are rendered as transparent.
2538 An error diffusion dither is done on the alpha channel. Note that
2539 this is independent of the translation performed on the colour
2540 channels, so some combinations may cause undesired artifacts.
2544 The ordered dither specified by tr_orddith is performed on the alpha
2549 This will only be used if the image has an alpha channel, and if there
2550 is space in the palette for a transparency colour.
2554 The highest alpha value at which a pixel will be made transparent when
2555 transp is 'threshold'. (0-255, default 127)
2559 The type of error diffusion to perform on the alpha channel when
2560 transp is 'errdiff'. This can be any defined error diffusion type
2561 except for custom (see errdiff below).
2565 The type of ordered dither to perform on the alpha channel when transp
2566 is 'ordered'. Possible values are:
2572 A semi-random map is used. The map is the same each time.
2584 horizontal line dither.
2588 vertical line dither.
2594 diagonal line dither
2600 diagonal line dither
2604 dot matrix dither (currently the default). This is probably the best
2605 for displays (like web pages).
2609 A custom dither matrix is used - see tr_map
2615 When tr_orddith is custom this defines an 8 x 8 matrix of integers
2616 representing the transparency threshold for pixels corresponding to
2617 each position. This should be a 64 element array where the first 8
2618 entries correspond to the first row of the matrix. Values should be
2623 Defines how the quantization engine will build the palette(s).
2624 Currently this is ignored if 'translate' is 'giflib', but that may
2625 change. Possible values are:
2631 Only colors supplied in 'colors' are used.
2635 The web color map is used (need url here.)
2639 The original code for generating the color map (Addi's code) is used.
2643 Other methods may be added in the future.
2647 A arrayref containing Imager::Color objects, which represents the
2648 starting set of colors to use in translating the images. webmap will
2649 ignore this. The final colors used are copied back into this array
2650 (which is expanded if necessary.)
2654 The maximum number of colors to use in the image.
2658 The method used to translate the RGB values in the source image into
2659 the colors selected by make_colors. Note that make_colors is ignored
2660 whene translate is 'giflib'.
2662 Possible values are:
2668 The giflib native quantization function is used.
2672 The closest color available is used.
2676 The pixel color is modified by perturb, and the closest color is chosen.
2680 An error diffusion dither is performed.
2684 It's possible other transate values will be added.
2688 The type of error diffusion dither to perform. These values (except
2689 for custom) can also be used in tr_errdif.
2695 Floyd-Steinberg dither
2699 Jarvis, Judice and Ninke dither
2707 Custom. If you use this you must also set errdiff_width,
2708 errdiff_height and errdiff_map.
2714 =item errdiff_height
2720 When translate is 'errdiff' and errdiff is 'custom' these define a
2721 custom error diffusion map. errdiff_width and errdiff_height define
2722 the size of the map in the arrayref in errdiff_map. errdiff_orig is
2723 an integer which indicates the current pixel position in the top row
2728 When translate is 'perturb' this is the magnitude of the random bias
2729 applied to each channel of the pixel before it is looked up in the
2734 =head2 Obtaining/setting attributes of images
2736 To get the size of an image in pixels the C<$img-E<gt>getwidth()> and
2737 C<$img-E<gt>getheight()> are used.
2739 To get the number of channels in
2740 an image C<$img-E<gt>getchannels()> is used. $img-E<gt>getmask() and
2741 $img-E<gt>setmask() are used to get/set the channel mask of the image.
2743 $mask=$img->getmask();
2744 $img->setmask(mask=>1+2); # modify red and green only
2745 $img->setmask(mask=>8); # modify alpha only
2746 $img->setmask(mask=>$mask); # restore previous mask
2748 The mask of an image describes which channels are updated when some
2749 operation is performed on an image. Naturally it is not possible to
2750 apply masks to operations like scaling that alter the dimensions of
2753 It is possible to have Imager find the number of colors in an image
2754 by using C<$img-E<gt>getcolorcount()>. It requires memory proportionally
2755 to the number of colors in the image so it is possible to have it
2756 stop sooner if you only need to know if there are more than a certain number
2757 of colors in the image. If there are more colors than asked for
2758 the function return undef. Examples:
2760 if (!defined($img->getcolorcount(maxcolors=>512)) {
2761 print "Less than 512 colors in image\n";
2764 The bits() method retrieves the number of bits used to represent each
2765 channel in a pixel, typically 8. The type() method returns either
2766 'direct' for truecolor images or 'paletted' for paletted images. The
2767 virtual() method returns non-zero if the image contains no actual
2768 pixels, for example masked images.
2770 =head2 Paletted Images
2772 In general you can work with paletted images in the same way as RGB
2773 images, except that if you attempt to draw to a paletted image with a
2774 color that is not in the image's palette, the image will be converted
2775 to an RGB image. This means that drawing on a paletted image with
2776 anti-aliasing enabled will almost certainly convert the image to RGB.
2778 You can add colors to a paletted image with the addcolors() method:
2780 my @colors = ( Imager::Color->new(255, 0, 0),
2781 Imager::Color->new(0, 255, 0) );
2782 my $index = $img->addcolors(colors=>\@colors);
2784 The return value is the index of the first color added, or undef if
2785 adding the colors would overflow the palette.
2787 Once you have colors in the palette you can overwrite them with the
2790 $img->setcolors(start=>$start, colors=>\@colors);
2792 Returns true on success.
2794 To retrieve existing colors from the palette use the getcolors() method:
2796 # get the whole palette
2797 my @colors = $img->getcolors();
2798 # get a single color
2799 my $color = $img->getcolors(start=>$index);
2800 # get a range of colors
2801 my @colors = $img->getcolors(start=>$index, count=>$count);
2803 To quickly find a color in the palette use findcolor():
2805 my $index = $img->findcolor(color=>$color);
2807 which returns undef on failure, or the index of the color.
2809 You can get the current palette size with $img->colorcount, and the
2810 maximum size of the palette with $img->maxcolors.
2812 =head2 Drawing Methods
2814 IMPLEMENTATION MORE OR LESS DONE CHECK THE TESTS
2815 DOCUMENTATION OF THIS SECTION OUT OF SYNC
2817 It is possible to draw with graphics primitives onto images. Such
2818 primitives include boxes, arcs, circles and lines. A reference
2819 oriented list follows.
2822 $img->box(color=>$blue,xmin=>10,ymin=>30,xmax=>200,ymax=>300,filled=>1);
2824 The above example calls the C<box> method for the image and the box
2825 covers the pixels with in the rectangle specified. If C<filled> is
2826 ommited it is drawn as an outline. If any of the edges of the box are
2827 ommited it will snap to the outer edge of the image in that direction.
2828 Also if a color is omitted a color with (255,255,255,255) is used
2832 $img->arc(color=>$red, r=20, x=>200, y=>100, d1=>10, d2=>20 );
2834 This creates a filled red arc with a 'center' at (200, 100) and spans
2835 10 degrees and the slice has a radius of 20. SEE section on BUGS.
2837 Both the arc() and box() methods can take a C<fill> parameter which
2838 can either be an Imager::Fill object, or a reference to a hash
2839 containing the parameters used to create the fill:
2841 $img->box(xmin=>10, ymin=>30, xmax=>150, ymax=>60,
2842 fill => { hatch=>'cross2' });
2844 my $fill = Imager::Fill->new(hatch=>'stipple');
2845 $img->box(fill=>$fill);
2847 See L<Imager::Fill> for the type of fills you can use.
2850 $img->circle(color=>$green, r=50, x=>200, y=>100);
2852 This creates a green circle with its center at (200, 100) and has a
2856 $img->line(color=>$green, x1=10, x2=>100,
2857 y1=>20, y2=>50, antialias=>1 );
2859 That draws an antialiased line from (10,100) to (20,50).
2862 $img->polyline(points=>[[$x0,$y0],[$x1,$y1],[$x2,$y2]],color=>$red);
2863 $img->polyline(x=>[$x0,$x1,$x2], y=>[$y0,$y1,$y2], antialias=>1);
2865 Polyline is used to draw multilple lines between a series of points.
2866 The point set can either be specified as an arrayref to an array of
2867 array references (where each such array represents a point). The
2868 other way is to specify two array references.
2870 You can fill a region that all has the same color using the
2871 flood_fill() method, for example:
2873 $img->flood_fill(x=>50, y=>50, color=>$color);
2875 will fill all regions the same color connected to the point (50, 50).
2877 You can also use a general fill, so you could fill the same region
2878 with a check pattern using:
2880 $img->flood_fill(x=>50, y=>50, fill=>{ hatch=>'check2x2' });
2882 See L<Imager::Fill> for more information on general fills.
2884 =head2 Text rendering
2886 Text rendering is described in the Imager::Font manpage.
2888 =head2 Image resizing
2890 To scale an image so porportions are maintained use the
2891 C<$img-E<gt>scale()> method. if you give either a xpixels or ypixels
2892 parameter they will determine the width or height respectively. If
2893 both are given the one resulting in a larger image is used. example:
2894 C<$img> is 700 pixels wide and 500 pixels tall.
2896 $img->scale(xpixels=>400); # 400x285
2897 $img->scale(ypixels=>400); # 560x400
2899 $img->scale(xpixels=>400,ypixels=>400); # 560x400
2900 $img->scale(xpixels=>400,ypixels=>400,type=>min); # 400x285
2902 $img->scale(scalefactor=>0.25); 175x125 $img->scale(); # 350x250
2904 if you want to create low quality previews of images you can pass
2905 C<qtype=E<gt>'preview'> to scale and it will use nearest neighbor
2906 sampling instead of filtering. It is much faster but also generates
2907 worse looking images - especially if the original has a lot of sharp
2908 variations and the scaled image is by more than 3-5 times smaller than
2911 If you need to scale images per axis it is best to do it simply by
2912 calling scaleX and scaleY. You can pass either 'scalefactor' or
2913 'pixels' to both functions.
2915 Another way to resize an image size is to crop it. The parameters
2916 to crop are the edges of the area that you want in the returned image.
2917 If a parameter is omited a default is used instead.
2919 $newimg = $img->crop(left=>50, right=>100, top=>10, bottom=>100);
2920 $newimg = $img->crop(left=>50, top=>10, width=>50, height=>90);
2921 $newimg = $img->crop(left=>50, right=>100); # top
2923 You can also specify width and height parameters which will produce a
2924 new image cropped from the center of the input image, with the given
2927 $newimg = $img->crop(width=>50, height=>50);
2929 The width and height parameters take precedence over the left/right
2930 and top/bottom parameters respectively.
2932 =head2 Copying images
2934 To create a copy of an image use the C<copy()> method. This is usefull
2935 if you want to keep an original after doing something that changes the image
2936 inplace like writing text.
2940 To copy an image to onto another image use the C<paste()> method.
2942 $dest->paste(left=>40,top=>20,img=>$logo);
2944 That copies the entire C<$logo> image onto the C<$dest> image so that the
2945 upper left corner of the C<$logo> image is at (40,20).
2948 =head2 Flipping images
2950 An inplace horizontal or vertical flip is possible by calling the
2951 C<flip()> method. If the original is to be preserved it's possible to
2952 make a copy first. The only parameter it takes is the C<dir>
2953 parameter which can take the values C<h>, C<v>, C<vh> and C<hv>.
2955 $img->flip(dir=>"h"); # horizontal flip
2956 $img->flip(dir=>"vh"); # vertical and horizontal flip
2957 $nimg = $img->copy->flip(dir=>"v"); # make a copy and flip it vertically
2959 =head2 Rotating images
2961 Use the rotate() method to rotate an image.
2963 To rotate by an exact amount in degrees or radians, use the 'degrees'
2964 or 'radians' parameter:
2966 my $rot20 = $img->rotate(degrees=>20);
2967 my $rotpi4 = $img->rotate(radians=>3.14159265/4);
2969 To rotate in steps of 90 degrees, use the 'right' parameter:
2971 my $rotated = $img->rotate(right=>270);
2973 Rotations are clockwise for positive values.
2975 =head2 Blending Images
2977 To put an image or a part of an image directly
2978 into another it is best to call the C<paste()> method on the image you
2981 $img->paste(img=>$srcimage,left=>30,top=>50);
2983 That will take paste C<$srcimage> into C<$img> with the upper
2984 left corner at (30,50). If no values are given for C<left>
2985 or C<top> they will default to 0.
2987 A more complicated way of blending images is where one image is
2988 put 'over' the other with a certain amount of opaqueness. The
2989 method that does this is rubthrough.
2991 $img->rubthrough(src=>$srcimage,tx=>30,ty=>50);
2993 That will take the image C<$srcimage> and overlay it with the upper
2994 left corner at (30,50). You can rub 2 or 4 channel images onto a 3
2995 channel image, or a 2 channel image onto a 1 channel image. The last
2996 channel is used as an alpha channel.
3001 A special image method is the filter method. An example is:
3003 $img->filter(type=>'autolevels');
3005 This will call the autolevels filter. Here is a list of the filters
3006 that are always avaliable in Imager. This list can be obtained by
3007 running the C<filterlist.perl> script that comes with the module
3011 autolevels lsat(0.1) usat(0.1) skew(0)
3012 bumpmap bump elevation(0) lightx lighty st(2)
3015 fountain xa ya xb yb ftype(linear) repeat(none) combine(none)
3016 super_sample(none) ssample_param(4) segments(see below)
3018 gradgen xo yo colors dist
3021 noise amount(3) subtype(0)
3022 postlevels levels(10)
3023 radnoise xo(100) yo(100) ascale(17.0) rscale(0.02)
3024 turbnoise xo(0.0) yo(0.0) scale(10.0)
3025 watermark wmark pixdiff(10) tx(0) ty(0)
3027 The default values are in parenthesis. All parameters must have some
3028 value but if a parameter has a default value it may be omitted when
3029 calling the filter function.
3037 scales the value of each channel so that the values in the image will
3038 cover the whole possible range for the channel. I<lsat> and I<usat>
3039 truncate the range by the specified fraction at the top and bottom of
3040 the range respectivly..
3044 uses the channel I<elevation> image I<bump> as a bumpmap on your
3045 image, with the light at (I<lightx>, I<lightty>), with a shadow length
3050 scales each channel by I<intensity>. Values of I<intensity> < 1.0
3051 will reduce the contrast.
3055 performs 2 1-dimensional convolutions on the image using the values
3056 from I<coef>. I<coef> should be have an odd length.
3060 renders a fountain fill, similar to the gradient tool in most paint
3061 software. The default fill is a linear fill from opaque black to
3062 opaque white. The points A(xa, ya) and B(xb, yb) control the way the
3063 fill is performed, depending on the ftype parameter:
3069 the fill ramps from A through to B.
3073 the fill ramps in both directions from A, where AB defines the length
3078 A is the center of a circle, and B is a point on it's circumference.
3079 The fill ramps from the center out to the circumference.
3083 A is the center of a square and B is the center of one of it's sides.
3084 This can be used to rotate the square. The fill ramps out to the
3085 edges of the square.
3089 A is the centre of a circle and B is a point on it's circumference. B
3090 marks the 0 and 360 point on the circle, with the fill ramping
3095 A is the center of a circle and B is a point on it's circumference. B
3096 marks the 0 and point on the circle, with the fill ramping in both
3097 directions to meet opposite.
3101 The I<repeat> option controls how the fill is repeated for some
3102 I<ftype>s after it leaves the AB range:
3108 no repeats, points outside of each range are treated as if they were
3109 on the extreme end of that range.
3113 the fill simply repeats in the positive direction
3117 the fill repeats in reverse and then forward and so on, in the
3122 the fill repeats in both the positive and negative directions (only
3123 meaningful for a linear fill).
3127 as for triangle, but in the negative direction too (only meaningful
3132 By default the fill simply overwrites the whole image (unless you have
3133 parts of the range 0 through 1 that aren't covered by a segment), if
3134 any segments of your fill have any transparency, you can set the
3135 I<combine> option to 'normal' to have the fill combined with the
3136 existing pixels. See the description of I<combine> in L<Imager/Fill>.
3138 If your fill has sharp edges, for example between steps if you use
3139 repeat set to 'triangle', you may see some aliased or ragged edges.
3140 You can enable super-sampling which will take extra samples within the
3141 pixel in an attempt anti-alias the fill.
3143 The possible values for the super_sample option are:
3149 no super-sampling is done
3153 a square grid of points are sampled. The number of points sampled is
3154 the square of ceil(0.5 + sqrt(ssample_param)).
3158 a random set of points within the pixel are sampled. This looks
3159 pretty bad for low ssample_param values.
3163 the points on the radius of a circle within the pixel are sampled.
3164 This seems to produce the best results, but is fairly slow (for now).
3168 You can control the level of sampling by setting the ssample_param
3169 option. This is roughly the number of points sampled, but depends on
3170 the type of sampling.
3172 The segments option is an arrayref of segments. You really should use
3173 the Imager::Fountain class to build your fountain fill. Each segment
3174 is an array ref containing:
3180 a floating point number between 0 and 1, the start of the range of fill parameters covered by this segment.
3184 a floating point number between start and end which can be used to
3185 push the color range towards one end of the segment.
3189 a floating point number between 0 and 1, the end of the range of fill
3190 parameters covered by this segment. This should be greater than
3197 The colors at each end of the segment. These can be either
3198 Imager::Color or Imager::Color::Float objects.
3202 The type of segment, this controls the way the fill parameter varies
3203 over the segment. 0 for linear, 1 for curved (unimplemented), 2 for
3204 sine, 3 for sphere increasing, 4 for sphere decreasing.
3208 The way the color varies within the segment, 0 for simple RGB, 1 for
3209 hue increasing and 2 for hue decreasing.
3213 Don't forgot to use Imager::Fountain instead of building your own.
3214 Really. It even loads GIMP gradient files.
3218 performs a gaussian blur of the image, using I<stddev> as the standard
3219 deviation of the curve used to combine pixels, larger values give
3220 bigger blurs. For a definition of Gaussian Blur, see:
3222 http://www.maths.abdn.ac.uk/~igc/tch/mx4002/notes/node99.html
3226 renders a gradient, with the given I<colors> at the corresponding
3227 points (x,y) in I<xo> and I<yo>. You can specify the way distance is
3228 measured for color blendeing by setting I<dist> to 0 for Euclidean, 1
3229 for Euclidean squared, and 2 for Manhattan distance.
3233 inverts the image, black to white, white to black. All channels are
3234 inverted, including the alpha channel if any.
3238 produces averaged tiles of the given I<size>.
3242 adds noise of the given I<amount> to the image. If I<subtype> is
3243 zero, the noise is even to each channel, otherwise noise is added to
3244 each channel independently.
3248 renders radiant Perlin turbulent noise. The centre of the noise is at
3249 (I<xo>, I<yo>), I<ascale> controls the angular scale of the noise ,
3250 and I<rscale> the radial scale, higher numbers give more detail.
3254 alters the image to have only I<levels> distinct level in each
3259 renders Perlin turbulent noise. (I<xo>, I<yo>) controls the origin of
3260 the noise, and I<scale> the scale of the noise, with lower numbers
3265 applies I<wmark> as a watermark on the image with strength I<pixdiff>,
3266 with an origin at (I<tx>, I<ty>)
3270 A demonstration of most of the filters can be found at:
3272 http://www.develop-help.com/imager/filters.html
3274 (This is a slow link.)
3276 =head2 Color transformations
3278 You can use the convert method to transform the color space of an
3279 image using a matrix. For ease of use some presets are provided.
3281 The convert method can be used to:
3287 convert an RGB or RGBA image to grayscale.
3291 convert a grayscale image to RGB.
3295 extract a single channel from an image.
3299 set a given channel to a particular value (or from another channel)
3303 The currently defined presets are:
3311 converts an RGBA image into a grayscale image with alpha channel, or
3312 an RGB image into a grayscale image without an alpha channel.
3314 This weights the RGB channels at 22.2%, 70.7% and 7.1% respectively.
3318 removes the alpha channel from a 2 or 4 channel image. An identity
3325 extracts the first channel of the image into a single channel image
3331 extracts the second channel of the image into a single channel image
3337 extracts the third channel of the image into a single channel image
3341 extracts the alpha channel of the image into a single channel image.
3343 If the image has 1 or 3 channels (assumed to be grayscale of RGB) then
3344 the resulting image will be all white.
3348 converts a grayscale image to RGB, preserving the alpha channel if any
3352 adds an alpha channel to a grayscale or RGB image. Preserves an
3353 existing alpha channel for a 2 or 4 channel image.
3357 For example, to convert an RGB image into a greyscale image:
3359 $new = $img->convert(preset=>'grey'); # or gray
3361 or to convert a grayscale image to an RGB image:
3363 $new = $img->convert(preset=>'rgb');
3365 The presets aren't necessary simple constants in the code, some are
3366 generated based on the number of channels in the input image.
3368 If you want to perform some other colour transformation, you can use
3369 the 'matrix' parameter.
3371 For each output pixel the following matrix multiplication is done:
3373 channel[0] [ [ $c00, $c01, ... ] inchannel[0]
3374 [ ... ] = ... x [ ... ]
3375 channel[n-1] [ $cn0, ..., $cnn ] ] inchannel[max]
3378 So if you want to swap the red and green channels on a 3 channel image:
3380 $new = $img->convert(matrix=>[ [ 0, 1, 0 ],
3384 or to convert a 3 channel image to greyscale using equal weightings:
3386 $new = $img->convert(matrix=>[ [ 0.333, 0.333, 0.334 ] ])
3388 =head2 Color Mappings
3390 You can use the map method to map the values of each channel of an
3391 image independently using a list of lookup tables. It's important to
3392 realize that the modification is made inplace. The function simply
3393 returns the input image again or undef on failure.
3395 Each channel is mapped independently through a lookup table with 256
3396 entries. The elements in the table should not be less than 0 and not
3397 greater than 255. If they are out of the 0..255 range they are
3398 clamped to the range. If a table does not contain 256 entries it is
3401 Single channels can mapped by specifying their name and the mapping
3402 table. The channel names are C<red>, C<green>, C<blue>, C<alpha>.
3404 @map = map { int( $_/2 } 0..255;
3405 $img->map( red=>\@map );
3407 It is also possible to specify a single map that is applied to all
3408 channels, alpha channel included. For example this applies a gamma
3409 correction with a gamma of 1.4 to the input image.
3412 @map = map { int( 0.5 + 255*($_/255)**$gamma ) } 0..255;
3413 $img->map(all=> \@map);
3415 The C<all> map is used as a default channel, if no other map is
3416 specified for a channel then the C<all> map is used instead. If we
3417 had not wanted to apply gamma to the alpha channel we would have used:
3419 $img->map(all=> \@map, alpha=>[]);
3421 Since C<[]> contains fewer than 256 element the gamma channel is
3424 It is also possible to simply specify an array of maps that are
3425 applied to the images in the rgba order. For example to apply
3426 maps to the C<red> and C<blue> channels one would use:
3428 $img->map(maps=>[\@redmap, [], \@bluemap]);
3432 =head2 Transformations
3434 Another special image method is transform. It can be used to generate
3435 warps and rotations and such features. It can be given the operations
3436 in postfix notation or the module Affix::Infix2Postfix can be used.
3437 Look in the test case t/t55trans.t for an example.
3439 transform() needs expressions (or opcodes) that determine the source
3440 pixel for each target pixel. Source expressions are infix expressions
3441 using any of the +, -, *, / or ** binary operators, the - unary
3442 operator, ( and ) for grouping and the sin() and cos() functions. The
3443 target pixel is input as the variables x and y.
3445 You specify the x and y expressions as xexpr and yexpr respectively.
3446 You can also specify opcodes directly, but that's magic deep enough
3447 that you can look at the source code.
3449 You can still use the transform() function, but the transform2()
3450 function is just as fast and is more likely to be enhanced and
3453 Later versions of Imager also support a transform2() class method
3454 which allows you perform a more general set of operations, rather than
3455 just specifying a spatial transformation as with the transform()
3456 method, you can also perform colour transformations, image synthesis
3457 and image combinations.
3459 transform2() takes an reference to an options hash, and a list of
3460 images to operate one (this list may be empty):
3465 my $img = Imager::transform2(\%opts, @imgs)
3466 or die "transform2 failed: $Imager::ERRSTR";
3468 The options hash may define a transformation function, and optionally:
3474 width - the width of the image in pixels. If this isn't supplied the
3475 width of the first input image is used. If there are no input images
3480 height - the height of the image in pixels. If this isn't supplied
3481 the height of the first input image is used. If there are no input
3482 images an error occurs.
3486 constants - a reference to hash of constants to define for the
3487 expression engine. Some extra constants are defined by Imager
3491 The tranformation function is specified using either the expr or
3492 rpnexpr member of the options.
3496 =item Infix expressions
3498 You can supply infix expressions to transform 2 with the expr keyword.
3500 $opts{expr} = 'return getp1(w-x, h-y)'
3502 The 'expression' supplied follows this general grammar:
3504 ( identifier '=' expr ';' )* 'return' expr
3506 This allows you to simplify your expressions using variables.
3508 A more complex example might be:
3510 $opts{expr} = 'pix = getp1(x,y); return if(value(pix)>0.8,pix*0.8,pix)'
3512 Currently to use infix expressions you must have the Parse::RecDescent
3513 module installed (available from CPAN). There is also what might be a
3514 significant delay the first time you run the infix expression parser
3515 due to the compilation of the expression grammar.
3517 =item Postfix expressions
3519 You can supply postfix or reverse-polish notation expressions to
3520 transform2() through the rpnexpr keyword.
3522 The parser for rpnexpr emulates a stack machine, so operators will
3523 expect to see their parameters on top of the stack. A stack machine
3524 isn't actually used during the image transformation itself.
3526 You can store the value at the top of the stack in a variable called
3527 foo using !foo and retrieve that value again using @foo. The !foo
3528 notation will pop the value from the stack.
3530 An example equivalent to the infix expression above:
3532 $opts{rpnexpr} = 'x y getp1 !pix @pix value 0.8 gt @pix 0.8 * @pix ifp'
3536 transform2() has a fairly rich range of operators.
3540 =item +, *, -, /, %, **
3542 multiplication, addition, subtraction, division, remainder and
3543 exponentiation. Multiplication, addition and subtraction can be used
3544 on colour values too - though you need to be careful - adding 2 white
3545 values together and multiplying by 0.5 will give you grey, not white.
3547 Division by zero (or a small number) just results in a large number.
3548 Modulo zero (or a small number) results in zero.
3550 =item sin(N), cos(N), atan2(y,x)
3552 Some basic trig functions. They work in radians, so you can't just
3555 =item distance(x1, y1, x2, y2)
3557 Find the distance between two points. This is handy (along with
3558 atan2()) for producing circular effects.
3562 Find the square root. I haven't had much use for this since adding
3563 the distance() function.
3567 Find the absolute value.
3569 =item getp1(x,y), getp2(x,y), getp3(x, y)
3571 Get the pixel at position (x,y) from the first, second or third image
3572 respectively. I may add a getpn() function at some point, but this
3573 prevents static checking of the instructions against the number of
3574 images actually passed in.
3576 =item value(c), hue(c), sat(c), hsv(h,s,v)
3578 Separates a colour value into it's value (brightness), hue (colour)
3579 and saturation elements. Use hsv() to put them back together (after
3580 suitable manipulation).
3582 =item red(c), green(c), blue(c), rgb(r,g,b)
3584 Separates a colour value into it's red, green and blue colours. Use
3585 rgb(r,g,b) to put it back together.
3589 Convert a value to an integer. Uses a C int cast, so it may break on
3592 =item if(cond,ntrue,nfalse), if(cond,ctrue,cfalse)
3594 A simple (and inefficient) if function.
3596 =item <=,<,==,>=,>,!=
3598 Relational operators (typically used with if()). Since we're working
3599 with floating point values the equalities are 'near equalities' - an
3600 epsilon value is used.
3602 =item &&, ||, not(n)
3604 Basic logical operators.
3612 =item rpnexpr=>'x 25 % 15 * y 35 % 10 * getp1 !pat x y getp1 !pix @pix sat 0.7 gt @pat @pix ifp'
3614 tiles a smaller version of the input image over itself where the
3615 colour has a saturation over 0.7.
3617 =item rpnexpr=>'x 25 % 15 * y 35 % 10 * getp1 !pat y 360 / !rat x y getp1 1 @rat - pmult @pat @rat pmult padd'
3619 tiles the input image over itself so that at the top of the image the
3620 full-size image is at full strength and at the bottom the tiling is
3623 =item rpnexpr=>'x y getp1 !pix @pix value 0.96 gt @pix sat 0.1 lt and 128 128 255 rgb @pix ifp'
3625 replace pixels that are white or almost white with a palish blue
3627 =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'
3629 Tiles the input image overitself where the image isn't white or almost
3632 =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'
3636 =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'
3638 A spiral built on top of a colour wheel.
3642 For details on expression parsing see L<Imager::Expr>. For details on
3643 the virtual machine used to transform the images, see
3644 L<Imager::regmach.pod>.
3646 =head2 Matrix Transformations
3648 Rather than having to write code in a little language, you can use a
3649 matrix to perform transformations, using the matrix_transform()
3652 my $im2 = $im->matrix_transform(matrix=>[ -1, 0, $im->getwidth-1,
3656 By default the output image will be the same size as the input image,
3657 but you can supply the xsize and ysize parameters to change the size.
3659 Rather than building matrices by hand you can use the Imager::Matrix2d
3660 module to build the matrices. This class has methods to allow you to
3661 scale, shear, rotate, translate and reflect, and you can combine these
3662 with an overloaded multiplication operator.
3664 WARNING: the matrix you provide in the matrix operator transforms the
3665 co-ordinates within the B<destination> image to the co-ordinates
3666 within the I<source> image. This can be confusing.
3668 Since Imager has 3 different fairly general ways of transforming an
3669 image spatially, this method also has a yatf() alias. Yet Another
3670 Transformation Function.
3672 =head2 Masked Images
3674 Masked images let you control which pixels are modified in an
3675 underlying image. Where the first channel is completely black in the
3676 mask image, writes to the underlying image are ignored.
3678 For example, given a base image called $img:
3680 my $mask = Imager->new(xsize=>$img->getwidth, ysize=>getheight,
3682 # ... draw something on the mask
3683 my $maskedimg = $img->masked(mask=>$mask);
3685 You can specifiy the region of the underlying image that is masked
3686 using the left, top, right and bottom options.
3688 If you just want a subset of the image, without masking, just specify
3689 the region without specifying a mask.
3693 It is possible to add filters to the module without recompiling the
3694 module itself. This is done by using DSOs (Dynamic shared object)
3695 avaliable on most systems. This way you can maintain our own filters
3696 and not have to get me to add it, or worse patch every new version of
3697 the Module. Modules can be loaded AND UNLOADED at runtime. This
3698 means that you can have a server/daemon thingy that can do something
3701 load_plugin("dynfilt/dyntest.so") || die "unable to load plugin\n";
3702 %hsh=(a=>35,b=>200,type=>lin_stretch);
3704 unload_plugin("dynfilt/dyntest.so") || die "unable to load plugin\n";
3705 $img->write(type=>'pnm',file=>'testout/t60.jpg')
3706 || die "error in write()\n";
3708 Someone decides that the filter is not working as it should -
3709 dyntest.c modified and recompiled.
3711 load_plugin("dynfilt/dyntest.so") || die "unable to load plugin\n";
3714 An example plugin comes with the module - Please send feedback to
3715 addi@umich.edu if you test this.
3717 Note: This seems to test ok on the following systems:
3718 Linux, Solaris, HPUX, OpenBSD, FreeBSD, TRU64/OSF1, AIX.
3719 If you test this on other systems please let me know.
3723 Image tags contain meta-data about the image, ie. information not
3724 stored as pixels of the image.
3726 At the perl level each tag has a name or code and a value, which is an
3727 integer or an arbitrary string. An image can contain more than one
3728 tag with the same name or code.
3730 You can retrieve tags from an image using the tags() method, you can
3731 get all of the tags in an image, as a list of array references, with
3732 the code or name of the tag followed by the value of the tag:
3734 my @alltags = $img->tags;
3736 or you can get all tags that have a given name:
3738 my @namedtags = $img->tags(name=>$name);
3742 my @tags = $img->tags(code=>$code);
3744 You can add tags using the addtag() method, either by name:
3746 my $index = $img->addtag(name=>$name, value=>$value);
3750 my $index = $img->addtag(code=>$code, value=>$value);
3752 You can remove tags with the deltag() method, either by index:
3754 $img->deltag(index=>$index);
3758 $img->deltag(name=>$name);
3762 $img->deltag(code=>$code);
3764 In each case deltag() returns the number of tags deleted.
3766 When you read a GIF image using read_multi(), each image can include
3773 the offset of the image from the left of the "screen" ("Image Left
3778 the offset of the image from the top of the "screen" ("Image Top Position")
3782 non-zero if the image was interlaced ("Interlace Flag")
3784 =item gif_screen_width
3786 =item gif_screen_height
3788 the size of the logical screen ("Logical Screen Width",
3789 "Logical Screen Height")
3793 Non-zero if this image had a local color map.
3795 =item gif_background
3797 The index in the global colormap of the logical screen's background
3798 color. This is only set if the current image uses the global
3801 =item gif_trans_index
3803 The index of the color in the colormap used for transparency. If the
3804 image has a transparency then it is returned as a 4 channel image with
3805 the alpha set to zero in this palette entry. ("Transparent Color Index")
3809 The delay until the next frame is displayed, in 1/100 of a second.
3812 =item gif_user_input
3814 whether or not a user input is expected before continuing (view dependent)
3815 ("User Input Flag").
3819 how the next frame is displayed ("Disposal Method")
3823 the number of loops from the Netscape Loop extension. This may be zero.
3827 the first block of the first gif comment before each image.
3831 Where applicable, the ("name") is the name of that field from the GIF89
3834 The following tags are set in a TIFF image when read, and can be set
3839 =item tiff_resolutionunit
3841 The value of the ResolutionUnit tag. This is ignored on writing if
3842 the i_aspect_only tag is non-zero.
3846 The following tags are set when a Windows BMP file is read:
3850 =item bmp_compression
3852 The type of compression, if any.
3854 =item bmp_important_colors
3856 The number of important colors as defined by the writer of the image.
3860 Some standard tags will be implemented as time goes by:
3868 The spatial resolution of the image in pixels per inch. If the image
3869 format uses a different scale, eg. pixels per meter, then this value
3870 is converted. A floating point number stored as a string.
3874 If this is non-zero then the values in i_xres and i_yres are treated
3875 as a ratio only. If the image format does not support aspect ratios
3876 then this is scaled so the smaller value is 72dpi.
3882 box, arc, circle do not support antialiasing yet. arc, is only filled
3883 as of yet. Some routines do not return $self where they should. This
3884 affects code like this, C<$img-E<gt>box()-E<gt>arc()> where an object
3887 When saving Gif images the program does NOT try to shave of extra
3888 colors if it is possible. If you specify 128 colors and there are
3889 only 2 colors used - it will have a 128 colortable anyway.
3893 Arnar M. Hrafnkelsson, addi@umich.edu, and recently lots of assistance
3894 from Tony Cook. See the README for a complete list.
3898 perl(1), Imager::Color(3), Imager::Font(3), Imager::Matrix2d(3),
3899 Affix::Infix2Postfix(3), Parse::RecDescent(3)
3900 http://www.eecs.umich.edu/~addi/perl/Imager/