6 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS %formats $DEBUG %filters %DSOs $ERRSTR $fontstate %OPCODES $I2P $FORMATGUESS);
154 $VERSION = '0.38pre9';
155 @ISA = qw(Exporter DynaLoader);
156 bootstrap Imager $VERSION;
160 i_init_fonts(); # Initialize font engines
161 for(i_list_formats()) { $formats{$_}++; }
163 if ($formats{'t1'}) {
167 if (!$formats{'t1'} and !$formats{'tt'}) {
168 $fontstate='no font support';
171 %OPCODES=(Add=>[0],Sub=>[1],Mult=>[2],Div=>[3],Parm=>[4],'sin'=>[5],'cos'=>[6],'x'=>[4,0],'y'=>[4,1]);
176 callseq => ['image','intensity'],
177 callsub => sub { my %hsh=@_; i_contrast($hsh{image},$hsh{intensity}); }
181 callseq => ['image', 'amount', 'subtype'],
182 defaults => { amount=>3,subtype=>0 },
183 callsub => sub { my %hsh=@_; i_noise($hsh{image},$hsh{amount},$hsh{subtype}); }
186 $filters{hardinvert} ={
187 callseq => ['image'],
189 callsub => sub { my %hsh=@_; i_hardinvert($hsh{image}); }
192 $filters{autolevels} ={
193 callseq => ['image','lsat','usat','skew'],
194 defaults => { lsat=>0.1,usat=>0.1,skew=>0.0 },
195 callsub => sub { my %hsh=@_; i_autolevels($hsh{image},$hsh{lsat},$hsh{usat},$hsh{skew}); }
198 $filters{turbnoise} ={
199 callseq => ['image'],
200 defaults => { xo=>0.0,yo=>0.0,scale=>10.0 },
201 callsub => sub { my %hsh=@_; i_turbnoise($hsh{image},$hsh{xo},$hsh{yo},$hsh{scale}); }
204 $filters{radnoise} ={
205 callseq => ['image'],
206 defaults => { xo=>100,yo=>100,ascale=>17.0,rscale=>0.02 },
207 callsub => sub { my %hsh=@_; i_radnoise($hsh{image},$hsh{xo},$hsh{yo},$hsh{rscale},$hsh{ascale}); }
211 callseq => ['image', 'coef'],
213 callsub => sub { my %hsh=@_; i_conv($hsh{image},$hsh{coef}); }
217 callseq => ['image', 'xo', 'yo', 'colors', 'dist'],
219 callsub => sub { my %hsh=@_; i_gradgen($hsh{image}, $hsh{xo}, $hsh{yo}, $hsh{colors}, $hsh{dist}); }
222 $filters{nearest_color} ={
223 callseq => ['image', 'xo', 'yo', 'colors', 'dist'],
225 callsub => sub { my %hsh=@_; i_nearest_color($hsh{image}, $hsh{xo}, $hsh{yo}, $hsh{colors}, $hsh{dist}); }
228 $FORMATGUESS=\&def_guess_type;
236 # NOTE: this might be moved to an import override later on
240 # (look through @_ for special tags, process, and remove them);
242 # print Dumper($pack);
247 my %parms=(loglevel=>1,@_);
249 init_log($parms{'log'},$parms{'loglevel'});
252 # if ($parms{T1LIB_CONFIG}) { $ENV{T1LIB_CONFIG}=$parms{T1LIB_CONFIG}; }
253 # if ( $ENV{T1LIB_CONFIG} and ( $fontstate eq 'missing conf' )) {
261 print "shutdown code\n";
262 # for(keys %instances) { $instances{$_}->DESTROY(); }
263 malloc_state(); # how do decide if this should be used? -- store something from the import
264 print "Imager exiting\n";
268 # Load a filter plugin
273 my ($DSO_handle,$str)=DSO_open($filename);
274 if (!defined($DSO_handle)) { $Imager::ERRSTR="Couldn't load plugin '$filename'\n"; return undef; }
275 my %funcs=DSO_funclist($DSO_handle);
276 if ($DEBUG) { print "loading module $filename\n"; $i=0; for(keys %funcs) { printf(" %2d: %s\n",$i++,$_); } }
278 for(keys %funcs) { if ($filters{$_}) { $ERRSTR="filter '$_' already exists\n"; DSO_close($DSO_handle); return undef; } }
280 $DSOs{$filename}=[$DSO_handle,\%funcs];
283 my $evstr="\$filters{'".$_."'}={".$funcs{$_}.'};';
284 $DEBUG && print "eval string:\n",$evstr,"\n";
296 if (!$DSOs{$filename}) { $ERRSTR="plugin '$filename' not loaded."; return undef; }
297 my ($DSO_handle,$funcref)=@{$DSOs{$filename}};
298 for(keys %{$funcref}) {
300 $DEBUG && print "unloading: $_\n";
302 my $rc=DSO_close($DSO_handle);
303 if (!defined($rc)) { $ERRSTR="unable to unload plugin '$filename'."; return undef; }
309 # Methods to be called on objects.
312 # Create a new Imager object takes very few parameters.
313 # usually you call this method and then call open from
314 # the resulting object
321 $self->{IMG}=undef; # Just to indicate what exists
322 $self->{ERRSTR}=undef; #
323 $self->{DEBUG}=$DEBUG;
324 $self->{DEBUG} && print "Initialized Imager\n";
325 if ($hsh{xsize} && $hsh{ysize}) { $self->img_set(%hsh); }
330 # Copy an entire image with no changes
331 # - if an image has magic the copy of it will not be magical
335 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
337 my $newcopy=Imager->new();
338 $newcopy->{IMG}=i_img_new();
339 i_copy($newcopy->{IMG},$self->{IMG});
347 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
348 my %input=(left=>0, top=>0, @_);
349 unless($input{img}) {
350 $self->{ERRSTR}="no source image";
353 $input{left}=0 if $input{left} <= 0;
354 $input{top}=0 if $input{top} <= 0;
356 my($r,$b)=i_img_info($src->{IMG});
358 i_copyto($self->{IMG}, $src->{IMG},
359 0,0, $r, $b, $input{left}, $input{top});
360 return $self; # What should go here??
363 # Crop an image - i.e. return a new image that is smaller
367 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
368 my %hsh=(left=>0,right=>0,top=>0,bottom=>0,@_);
370 my ($w,$h,$l,$r,$b,$t)=($self->getwidth(),$self->getheight(),
371 @hsh{qw(left right bottom top)});
372 $l=0 if not defined $l;
373 $t=0 if not defined $t;
374 $r=$self->getwidth if not defined $r;
375 $b=$self->getheight if not defined $b;
377 ($l,$r)=($r,$l) if $l>$r;
378 ($t,$b)=($b,$t) if $t>$b;
381 $l=int(0.5+($w-$hsh{'width'})/2);
386 if ($hsh{'height'}) {
387 $b=int(0.5+($h-$hsh{'height'})/2);
388 $t=$h+$hsh{'height'};
390 $hsh{'height'}=$b-$t;
393 # print "l=$l, r=$r, h=$hsh{'width'}\n";
394 # print "t=$t, b=$b, w=$hsh{'height'}\n";
396 my $dst=Imager->new(xsize=>$hsh{'width'},ysize=>$hsh{'height'},channels=>$self->getchannels());
398 i_copyto($dst->{IMG},$self->{IMG},$l,$t,$r,$b,0,0);
402 # Sets an image to a certain size and channel number
403 # if there was previously data in the image it is discarded
408 my %hsh=(xsize=>100,ysize=>100,channels=>3,@_);
410 if (defined($self->{IMG})) {
411 i_img_destroy($self->{IMG});
415 $self->{IMG}=Imager::ImgRaw::new($hsh{'xsize'},$hsh{'ysize'},$hsh{'channels'});
418 # Read an image from file
425 if (defined($self->{IMG})) {
426 i_img_destroy($self->{IMG});
430 if (!$input{fd} and !$input{file} and !$input{data}) { $self->{ERRSTR}='no file, fd or data parameter'; return undef; }
432 $fh = new IO::File($input{file},"r");
433 if (!defined $fh) { $self->{ERRSTR}='Could not open file'; return undef; }
437 if ($input{fd}) { $fd=$input{fd} };
439 # FIXME: Find the format here if not specified
440 # yes the code isn't here yet - next week maybe?
442 if (!$input{type} and $input{file}) { $input{type}=$FORMATGUESS->($input{file}); }
443 if (!$formats{$input{type}}) { $self->{ERRSTR}='format not supported'; return undef; }
445 my %iolready=(jpeg=>1, tiff=>1, pnm=>1);
447 if ($iolready{$input{type}}) {
449 $IO = io_new_fd($fd); # sort of simple for now eh?
451 if ( $input{type} eq 'jpeg' ) {
452 ($self->{IMG},$self->{IPTCRAW})=i_readjpeg_wiol( $IO );
453 if ( !defined($self->{IMG}) ) { $self->{ERRSTR}='unable to read jpeg image'; return undef; }
454 $self->{DEBUG} && print "loading a jpeg file\n";
458 if ( $input{type} eq 'tiff' ) {
459 $self->{IMG}=i_readtiff_wiol( $IO, -1 ); # Fixme, check if that length parameter is ever needed
460 if ( !defined($self->{IMG}) ) { $self->{ERRSTR}='unable to read tiff image'; return undef; }
461 $self->{DEBUG} && print "loading a tiff file\n";
465 if ( $input{type} eq 'pnm' ) {
466 $self->{IMG}=i_readpnm_wiol( $IO, -1 ); # Fixme, check if that length parameter is ever needed
467 if ( !defined($self->{IMG}) ) { $self->{ERRSTR}='unable to read pnm image'; return undef; }
468 $self->{DEBUG} && print "loading a pnm file\n";
474 # Old code for reference while changing the new stuff
477 if (!$input{type} and $input{file}) { $input{type}=$FORMATGUESS->($input{file}); }
478 if (!$input{type}) { $self->{ERRSTR}='type parameter missing and not possible to guess from extension'; return undef; }
480 if (!$formats{$input{type}}) { $self->{ERRSTR}='format not supported'; return undef; }
483 $fh = new IO::File($input{file},"r");
484 if (!defined $fh) { $self->{ERRSTR}='Could not open file'; return undef; }
488 if ($input{fd}) { $fd=$input{fd} };
490 if ( $input{type} eq 'gif' ) {
491 if (exists $input{data}) { $self->{IMG}=i_readgif_scalar($input{data}); }
492 else { $self->{IMG}=i_readgif( $fd ) }
493 if ( !defined($self->{IMG}) ) { $self->{ERRSTR}='unable to read gif image'; return undef; }
494 $self->{DEBUG} && print "loading a gif file\n";
495 } elsif ( $input{type} eq 'jpeg' ) {
496 if (exists $input{data}) { ($self->{IMG},$self->{IPTCRAW})=i_readjpeg_scalar($input{data}); }
497 else { ($self->{IMG},$self->{IPTCRAW})=i_readjpeg( $fd ); }
498 if ( !defined($self->{IMG}) ) { $self->{ERRSTR}='unable to read jpeg image'; return undef; }
499 $self->{DEBUG} && print "loading a jpeg file\n";
500 } elsif ( $input{type} eq 'png' ) {
501 if (exists $input{data}) { $self->{IMG}=i_readpng_scalar($input{data}); }
502 else { $self->{IMG}=i_readpng( $fd ); }
503 if ( !defined($self->{IMG}) ) { $self->{ERRSTR}='unable to read png image'; return undef; }
504 $self->{DEBUG} && print "loading a png file\n";
505 } elsif ( $input{type} eq 'raw' ) {
506 my %params=(datachannels=>3,storechannels=>3,interleave=>1);
507 for(keys(%input)) { $params{$_}=$input{$_}; }
509 if ( !($params{xsize} && $params{ysize}) ) { $self->{ERRSTR}='missing xsize or ysize parameter for raw'; return undef; }
510 $self->{IMG}=i_readraw( $fd, $params{xsize}, $params{ysize},
511 $params{datachannels}, $params{storechannels}, $params{interleave});
512 if ( !defined($self->{IMG}) ) { $self->{ERRSTR}='unable to read raw image'; return undef; }
513 $self->{DEBUG} && print "loading a raw file\n";
520 # Write an image to file
524 my %input=(jpegquality=>75, gifquant=>'mc', lmdither=>6.0, lmfixed=>[], @_);
525 my ($fh, $rc, $fd, $IO);
527 my %iolready=( tiff=>1 ); # this will be SO MUCH BETTER once they are all in there
529 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
531 if (!$input{file} and !$input{'fd'} and !$input{'data'}) { $self->{ERRSTR}='file/fd/data parameter missing'; return undef; }
532 if (!$input{type}) { $input{type}=$FORMATGUESS->($input{file}); }
533 if (!$input{type}) { $self->{ERRSTR}='type parameter missing and not possible to guess from extension'; return undef; }
535 if (!$formats{$input{type}}) { $self->{ERRSTR}='format not supported'; return undef; }
537 if (exists $input{'fd'}) {
539 } elsif (exists $input{'data'}) {
540 $IO = Imager::io_new_bufchain();
542 $fh = new IO::File($input{file},"w+");
543 if (!defined $fh) { $self->{ERRSTR}='Could not open file'; return undef; }
550 if ($iolready{$input{type}}) {
552 $IO = io_new_fd($fd);
555 if ($input{type} eq 'tiff') {
556 if (!i_writetiff_wiol($self->{IMG}, $IO)) { $self->{ERRSTR}='Could not write to buffer'; return undef; }
559 my $data = io_slurp($IO);
560 if (!$data) { $self->{ERRSTR}='Could not slurp from buffer'; return undef; }
562 ${$input{data}} = $data;
566 if ( $input{type} eq 'gif' ) {
567 if (not $input{gifplanes}) {
569 my $count=i_count_colors($self->{IMG}, 256);
570 $gp=8 if $count == -1;
571 $gp=1 if not $gp and $count <= 2;
572 $gp=2 if not $gp and $count <= 4;
573 $gp=3 if not $gp and $count <= 8;
574 $gp=4 if not $gp and $count <= 16;
575 $gp=5 if not $gp and $count <= 32;
576 $gp=6 if not $gp and $count <= 64;
577 $gp=7 if not $gp and $count <= 128;
578 $input{gifplanes} = $gp || 8;
581 if ($input{gifplanes}>8) {
584 if ($input{gifquant} eq 'gen' || $input{callback}) {
587 if ($input{gifquant} eq 'lm') {
589 $input{make_colors} = 'addi';
590 $input{translate} = 'perturb';
591 $input{perturb} = $input{lmdither};
592 } elsif ($input{gifquant} eq 'gen') {
593 # just pass options through
595 $input{make_colors} = 'webmap'; # ignored
596 $input{translate} = 'giflib';
599 if ($input{callback}) {
600 defined $input{maxbuffer} or $input{maxbuffer} = -1;
601 $rc = i_writegif_callback($input{callback}, $input{maxbuffer},
602 \%input, $self->{IMG});
604 $rc = i_writegif_gen($fd, \%input, $self->{IMG});
609 } elsif ($input{gifquant} eq 'lm') {
610 $rc=i_writegif($self->{IMG},$fd,$input{gifplanes},$input{lmdither},$input{lmfixed});
612 $rc=i_writegifmc($self->{IMG},$fd,$input{gifplanes});
614 if ( !defined($rc) ) {
615 $self->{ERRSTR}='unable to write gif image'; return undef;
617 $self->{DEBUG} && print "writing a gif file\n";
619 } elsif ( $input{type} eq 'jpeg' ) {
620 $rc=i_writejpeg($self->{IMG},$fd,$input{jpegquality});
621 if ( !defined($rc) ) {
622 $self->{ERRSTR}='unable to write jpeg image'; return undef;
624 $self->{DEBUG} && print "writing a jpeg file\n";
625 } elsif ( $input{type} eq 'png' ) {
626 $rc=i_writepng($self->{IMG},$fd);
627 if ( !defined($rc) ) {
628 $self->{ERRSTR}='unable to write png image'; return undef;
630 $self->{DEBUG} && print "writing a png file\n";
631 } elsif ( $input{type} eq 'pnm' ) {
632 $rc=i_writeppm($self->{IMG},$fd);
633 if ( !defined($rc) ) {
634 $self->{ERRSTR}='unable to write pnm image'; return undef;
636 $self->{DEBUG} && print "writing a pnm file\n";
637 } elsif ( $input{type} eq 'raw' ) {
638 $rc=i_writeraw($self->{IMG},$fd);
639 if ( !defined($rc) ) {
640 $self->{ERRSTR}='unable to write raw image'; return undef;
642 $self->{DEBUG} && print "writing a raw file\n";
643 } elsif ( $input{type} eq 'tiff' ) {
644 $rc=i_writetiff_wiol($self->{IMG},io_new_fd($fd) );
645 if ( !defined($rc) ) {
646 $self->{ERRSTR}='unable to write tiff image'; return undef;
648 $self->{DEBUG} && print "writing a tiff file\n";
656 my ($class, $opts, @images) = @_;
658 if ($opts->{type} eq 'gif') {
659 # translate to ImgRaw
660 if (grep !UNIVERSAL::isa($_, 'Imager') || !$_->{IMG}, @images) {
661 $ERRSTR = "Usage: Imager->write_multi({ options }, @images)";
664 my @work = map $_->{IMG}, @images;
665 if ($opts->{callback}) {
666 # Note: you may need to fix giflib for this one to work
667 my $maxbuffer = $opts->{maxbuffer};
668 defined $maxbuffer or $maxbuffer = -1; # max by default
669 return i_writegif_callback($opts->{callback}, $maxbuffer,
673 return i_writegif_gen($opts->{fd}, $opts, @work);
676 my $fh = IO::File->new($opts->{file}, "w+");
678 $ERRSTR = "Error creating $opts->{file}: $!";
682 return i_writegif_gen(fileno($fh), $opts, @work);
686 $ERRSTR = "Sorry, write_multi doesn't support $opts->{type} yet";
691 # Destroy an Imager object
695 # delete $instances{$self};
696 if (defined($self->{IMG})) {
697 i_img_destroy($self->{IMG});
700 # print "Destroy Called on an empty image!\n"; # why did I put this here??
704 # Perform an inplace filter of an image
705 # that is the image will be overwritten with the data
711 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
713 if (!$input{type}) { $self->{ERRSTR}='type parameter missing'; return undef; }
715 if ( (grep { $_ eq $input{type} } keys %filters) != 1) {
716 $self->{ERRSTR}='type parameter not matching any filter'; return undef;
719 if (defined($filters{$input{type}}{defaults})) {
720 %hsh=('image',$self->{IMG},%{$filters{$input{type}}{defaults}},%input);
722 %hsh=('image',$self->{IMG},%input);
725 my @cs=@{$filters{$input{type}}{callseq}};
728 if (!defined($hsh{$_})) {
729 $self->{ERRSTR}="missing parameter '$_' for filter ".$input{type}; return undef;
733 &{$filters{$input{type}}{callsub}}(%hsh);
737 $self->{DEBUG} && print "callseq is: @cs\n";
738 $self->{DEBUG} && print "matching callseq is: @b\n";
743 # Scale an image to requested size and return the scaled version
747 my %opts=(scalefactor=>0.5,type=>'max',qtype=>'normal',@_);
748 my $img = Imager->new();
749 my $tmp = Imager->new();
751 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
753 if ($opts{xpixels} and $opts{ypixels} and $opts{type}) {
754 my ($xpix,$ypix)=( $opts{xpixels}/$self->getwidth() , $opts{ypixels}/$self->getheight() );
755 if ($opts{type} eq 'min') { $opts{scalefactor}=min($xpix,$ypix); }
756 if ($opts{type} eq 'max') { $opts{scalefactor}=max($xpix,$ypix); }
757 } elsif ($opts{xpixels}) { $opts{scalefactor}=$opts{xpixels}/$self->getwidth(); }
758 elsif ($opts{ypixels}) { $opts{scalefactor}=$opts{ypixels}/$self->getheight(); }
760 if ($opts{qtype} eq 'normal') {
761 $tmp->{IMG}=i_scaleaxis($self->{IMG},$opts{scalefactor},0);
762 if ( !defined($tmp->{IMG}) ) { $self->{ERRSTR}='unable to scale image'; return undef; }
763 $img->{IMG}=i_scaleaxis($tmp->{IMG},$opts{scalefactor},1);
764 if ( !defined($img->{IMG}) ) { $self->{ERRSTR}='unable to scale image'; return undef; }
767 if ($opts{'qtype'} eq 'preview') {
768 $img->{IMG}=i_scale_nn($self->{IMG},$opts{'scalefactor'},$opts{'scalefactor'});
769 if ( !defined($img->{IMG}) ) { $self->{ERRSTR}='unable to scale image'; return undef; }
772 $self->{ERRSTR}='scale: invalid value for qtype'; return undef;
775 # Scales only along the X axis
779 my %opts=(scalefactor=>0.5,@_);
781 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
783 my $img = Imager->new();
785 if ($opts{pixels}) { $opts{scalefactor}=$opts{pixels}/$self->getwidth(); }
787 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
788 $img->{IMG}=i_scaleaxis($self->{IMG},$opts{scalefactor},0);
790 if ( !defined($img->{IMG}) ) { $self->{ERRSTR}='unable to scale image'; return undef; }
794 # Scales only along the Y axis
798 my %opts=(scalefactor=>0.5,@_);
800 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
802 my $img = Imager->new();
804 if ($opts{pixels}) { $opts{scalefactor}=$opts{pixels}/$self->getheight(); }
806 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
807 $img->{IMG}=i_scaleaxis($self->{IMG},$opts{scalefactor},1);
809 if ( !defined($img->{IMG}) ) { $self->{ERRSTR}='unable to scale image'; return undef; }
814 # Transform returns a spatial transformation of the input image
815 # this moves pixels to a new location in the returned image.
816 # NOTE - should make a utility function to check transforms for
821 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
823 my (@op,@ropx,@ropy,$iop,$or,@parm,$expr,@xt,@yt,@pt,$numre);
825 # print Dumper(\%opts);
828 if ( $opts{'xexpr'} and $opts{'yexpr'} ) {
830 eval ("use Affix::Infix2Postfix;");
833 $self->{ERRSTR}='transform: expr given and Affix::Infix2Postfix is not avaliable.';
836 $I2P=Affix::Infix2Postfix->new('ops'=>[{op=>'+',trans=>'Add'},
837 {op=>'-',trans=>'Sub'},
838 {op=>'*',trans=>'Mult'},
839 {op=>'/',trans=>'Div'},
840 {op=>'-',type=>'unary',trans=>'u-'},
842 {op=>'func',type=>'unary'}],
843 'grouping'=>[qw( \( \) )],
844 'func'=>[qw( sin cos )],
849 @xt=$I2P->translate($opts{'xexpr'});
850 @yt=$I2P->translate($opts{'yexpr'});
852 $numre=$I2P->{'numre'};
855 for(@xt) { if (/$numre/) { push(@pt,$_); push(@{$opts{'xopcodes'}},'Parm',$#pt); } else { push(@{$opts{'xopcodes'}},$_); } }
856 for(@yt) { if (/$numre/) { push(@pt,$_); push(@{$opts{'yopcodes'}},'Parm',$#pt); } else { push(@{$opts{'yopcodes'}},$_); } }
857 @{$opts{'parm'}}=@pt;
860 # print Dumper(\%opts);
862 if ( !exists $opts{'xopcodes'} or @{$opts{'xopcodes'}}==0) {
863 $self->{ERRSTR}='transform: no xopcodes given.';
867 @op=@{$opts{'xopcodes'}};
869 if (!defined ($OPCODES{$iop}) and ($iop !~ /^\d+$/) ) {
870 $self->{ERRSTR}="transform: illegal opcode '$_'.";
873 push(@ropx,(exists $OPCODES{$iop}) ? @{$OPCODES{$iop}} : $iop );
879 if ( !exists $opts{'yopcodes'} or @{$opts{'yopcodes'}}==0) {
880 $self->{ERRSTR}='transform: no yopcodes given.';
884 @op=@{$opts{'yopcodes'}};
886 if (!defined ($OPCODES{$iop}) and ($iop !~ /^\d+$/) ) {
887 $self->{ERRSTR}="transform: illegal opcode '$_'.";
890 push(@ropy,(exists $OPCODES{$iop}) ? @{$OPCODES{$iop}} : $iop );
895 if ( !exists $opts{'parm'}) {
896 $self->{ERRSTR}='transform: no parameter arg given.';
900 # print Dumper(\@ropx);
901 # print Dumper(\@ropy);
902 # print Dumper(\@ropy);
904 my $img = Imager->new();
905 $img->{IMG}=i_transform($self->{IMG},\@ropx,\@ropy,$opts{'parm'});
906 if ( !defined($img->{IMG}) ) { $self->{ERRSTR}='transform: failed'; return undef; }
914 my ($opts, @imgs) = @_;
917 # this is fairly big, delay loading it
918 eval "use Imager::Expr";
923 $opts->{variables} = [ qw(x y) ];
924 my ($width, $height) = @{$opts}{qw(width height)};
926 $width ||= $imgs[0]->getwidth();
927 $height ||= $imgs[0]->getheight();
929 for my $img (@imgs) {
930 $opts->{constants}{"w$img_num"} = $img->getwidth();
931 $opts->{constants}{"h$img_num"} = $img->getheight();
932 $opts->{constants}{"cx$img_num"} = $img->getwidth()/2;
933 $opts->{constants}{"cy$img_num"} = $img->getheight()/2;
938 $opts->{constants}{w} = $width;
939 $opts->{constants}{cx} = $width/2;
942 $Imager::ERRSTR = "No width supplied";
946 $opts->{constants}{h} = $height;
947 $opts->{constants}{cy} = $height/2;
950 $Imager::ERRSTR = "No height supplied";
953 my $code = Imager::Expr->new($opts);
955 $Imager::ERRSTR = Imager::Expr::error();
959 my $img = Imager->new();
960 $img->{IMG} = i_transform2($opts->{width}, $opts->{height}, $code->code(),
961 $code->nregs(), $code->cregs(),
962 [ map { $_->{IMG} } @imgs ]);
963 if (!defined $img->{IMG}) {
964 $Imager::ERRSTR = "transform2 failed";
981 my %opts=(tx=>0,ty=>0,@_);
983 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
984 unless ($opts{src} && $opts{src}->{IMG}) { $self->{ERRSTR}='empty input image for source'; return undef; }
986 i_rubthru($self->{IMG}, $opts{src}->{IMG}, $opts{tx},$opts{ty});
992 # These two are supported for legacy code only
995 return Imager::Color->new($_[0], $_[1], $_[2], $_[3]);
999 return Imager::Color::set($_[0], $_[1], $_[2], $_[3], $_[4]);
1004 # Draws a box between the specified corner points.
1008 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1009 my $dflcl=i_color_new(255,255,255,255);
1010 my %opts=(color=>$dflcl,xmin=>0,ymin=>0,xmax=>$self->getwidth()-1,ymax=>$self->getheight()-1,@_);
1012 if (exists $opts{'box'}) {
1013 $opts{'xmin'} = min($opts{'box'}->[0],$opts{'box'}->[2]);
1014 $opts{'xmax'} = max($opts{'box'}->[0],$opts{'box'}->[2]);
1015 $opts{'ymin'} = min($opts{'box'}->[1],$opts{'box'}->[3]);
1016 $opts{'ymax'} = max($opts{'box'}->[1],$opts{'box'}->[3]);
1019 if ($opts{filled}) { i_box_filled($self->{IMG},$opts{xmin},$opts{ymin},$opts{xmax},$opts{ymax},$opts{color}); }
1020 else { i_box($self->{IMG},$opts{xmin},$opts{ymin},$opts{xmax},$opts{ymax},$opts{color}); }
1024 # Draws an arc - this routine SUCKS and is buggy - it sometimes doesn't work when the arc is a convex polygon
1028 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1029 my $dflcl=i_color_new(255,255,255,255);
1030 my %opts=(color=>$dflcl,
1031 'r'=>min($self->getwidth(),$self->getheight())/3,
1032 'x'=>$self->getwidth()/2,
1033 'y'=>$self->getheight()/2,
1034 'd1'=>0, 'd2'=>361, @_);
1035 i_arc($self->{IMG},$opts{'x'},$opts{'y'},$opts{'r'},$opts{'d1'},$opts{'d2'},$opts{'color'});
1039 # Draws a line from one point to (but not including) the destination point
1043 my $dflcl=i_color_new(0,0,0,0);
1044 my %opts=(color=>$dflcl,@_);
1045 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1047 unless (exists $opts{x1} and exists $opts{y1}) { $self->{ERRSTR}='missing begining coord'; return undef; }
1048 unless (exists $opts{x2} and exists $opts{y2}) { $self->{ERRSTR}='missing ending coord'; return undef; }
1050 if ($opts{antialias}) {
1051 i_line_aa($self->{IMG},$opts{x1}, $opts{y1}, $opts{x2}, $opts{y2}, $opts{color});
1053 i_draw($self->{IMG},$opts{x1}, $opts{y1}, $opts{x2}, $opts{y2}, $opts{color});
1058 # Draws a line between an ordered set of points - It more or less just transforms this
1059 # into a list of lines.
1063 my ($pt,$ls,@points);
1064 my $dflcl=i_color_new(0,0,0,0);
1065 my %opts=(color=>$dflcl,@_);
1067 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1069 if (exists($opts{points})) { @points=@{$opts{points}}; }
1070 if (!exists($opts{points}) and exists($opts{'x'}) and exists($opts{'y'}) ) {
1071 @points=map { [ $opts{'x'}->[$_],$opts{'y'}->[$_] ] } (0..(scalar @{$opts{'x'}}-1));
1074 # print Dumper(\@points);
1076 if ($opts{antialias}) {
1078 if (defined($ls)) { i_line_aa($self->{IMG},$ls->[0],$ls->[1],$pt->[0],$pt->[1],$opts{color}); }
1083 if (defined($ls)) { i_draw($self->{IMG},$ls->[0],$ls->[1],$pt->[0],$pt->[1],$opts{color}); }
1090 # this the multipoint bezier curve
1091 # this is here more for testing that actual usage since
1092 # this is not a good algorithm. Usually the curve would be
1093 # broken into smaller segments and each done individually.
1097 my ($pt,$ls,@points);
1098 my $dflcl=i_color_new(0,0,0,0);
1099 my %opts=(color=>$dflcl,@_);
1101 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1103 if (exists $opts{points}) {
1104 $opts{'x'}=map { $_->[0]; } @{$opts{'points'}};
1105 $opts{'y'}=map { $_->[1]; } @{$opts{'points'}};
1108 unless ( @{$opts{'x'}} and @{$opts{'x'}} == @{$opts{'y'}} ) {
1109 $self->{ERRSTR}='Missing or invalid points.';
1113 i_bezier_multi($self->{IMG},$opts{'x'},$opts{'y'},$opts{'color'});
1118 # destructive border - image is shrunk by one pixel all around
1121 my ($self,%opts)=@_;
1122 my($tx,$ty)=($self->getwidth()-1,$self->getheight()-1);
1123 $self->polyline('x'=>[0,$tx,$tx,0,0],'y'=>[0,0,$ty,$ty,0],%opts);
1127 # Get the width of an image
1131 if (!defined($self->{IMG})) { $self->{ERRSTR} = 'image is empty'; return undef; }
1132 return (i_img_info($self->{IMG}))[0];
1135 # Get the height of an image
1139 if (!defined($self->{IMG})) { $self->{ERRSTR} = 'image is empty'; return undef; }
1140 return (i_img_info($self->{IMG}))[1];
1143 # Get number of channels in an image
1147 if (!defined($self->{IMG})) { $self->{ERRSTR} = 'image is empty'; return undef; }
1148 return i_img_getchannels($self->{IMG});
1155 if (!defined($self->{IMG})) { $self->{ERRSTR} = 'image is empty'; return undef; }
1156 return i_img_getmask($self->{IMG});
1164 if (!defined($self->{IMG})) { $self->{ERRSTR} = 'image is empty'; return undef; }
1165 i_img_setmask( $self->{IMG} , $opts{mask} );
1168 # Get number of colors in an image
1172 my %opts=(maxcolors=>2**30,@_);
1173 if (!defined($self->{IMG})) { $self->{ERRSTR}='image is empty'; return undef; }
1174 my $rc=i_count_colors($self->{IMG},$opts{'maxcolors'});
1175 return ($rc==-1? undef : $rc);
1178 # draw string to an image
1182 unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
1184 my %input=('x'=>0, 'y'=>0, @_);
1185 $input{string}||=$input{text};
1187 unless(exists $input{string}) {
1188 $self->{ERRSTR}="missing required parameter 'string'";
1192 unless($input{font}) {
1193 $self->{ERRSTR}="missing required parameter 'font'";
1198 my $font=$input{'font'};
1199 my $align=$font->{'align'} unless exists $input{'align'};
1200 my $color=$input{'color'} || $font->{'color'};
1201 my $size=$input{'size'} || $font->{'size'};
1203 if (!defined($size)) { $self->{ERRSTR}='No size parameter and no default in font'; return undef; }
1205 $aa=$font->{'aa'} if exists $font->{'aa'};
1206 $aa=$input{'aa'} if exists $input{'aa'};
1210 # unless($font->can('text')) {
1211 # $self->{ERRSTR}="font is unable to do what we need";
1216 # warn Dumper($font);
1218 # print "Channel=".$input{'channel'}."\n";
1220 if ( $font->{'type'} eq 't1' ) {
1221 if ( exists $input{'channel'} ) {
1222 Imager::Font::t1_set_aa_level($aa);
1223 i_t1_cp($self->{IMG},$input{'x'},$input{'y'},
1224 $input{'channel'},$font->{'id'},$size,
1225 $input{'string'},length($input{'string'}),1);
1227 Imager::Font::t1_set_aa_level($aa);
1228 i_t1_text($self->{IMG},$input{'x'},$input{'y'},
1229 $color,$font->{'id'},$size,
1230 $input{'string'},length($input{'string'}),1);
1234 if ( $font->{'type'} eq 'tt' ) {
1235 if ( exists $input{'channel'} ) {
1236 i_tt_cp($font->{'id'},$self->{IMG},$input{'x'},$input{'y'},$input{'channel'},
1237 $size,$input{'string'},length($input{'string'}),$aa);
1239 i_tt_text($font->{'id'},$self->{IMG},$input{'x'},$input{'y'},$color,$size,
1240 $input{'string'},length($input{'string'}),$aa);
1251 # Shortcuts that can be exported
1253 sub newcolor { Imager::Color->new(@_); }
1254 sub newfont { Imager::Font->new(@_); }
1256 *NC=*newcolour=*newcolor;
1263 #### Utility routines
1265 sub errstr { $_[0]->{ERRSTR} }
1272 # Default guess for the type of an image from extension
1274 sub def_guess_type {
1277 $ext=($name =~ m/\.([^\.]+)$/)[0];
1278 return 'tiff' if ($ext =~ m/^tiff?$/);
1279 return 'jpeg' if ($ext =~ m/^jpe?g$/);
1280 return 'pnm' if ($ext =~ m/^p[pgb]m$/);
1281 return 'png' if ($ext eq "png");
1282 return 'gif' if ($ext eq "gif");
1286 # get the minimum of a list
1290 for(@_) { if ($_<$mx) { $mx=$_; }}
1294 # get the maximum of a list
1298 for(@_) { if ($_>$mx) { $mx=$_; }}
1302 # string stuff for iptc headers
1306 $str = substr($str,3);
1307 $str =~ s/[\n\r]//g;
1314 # A little hack to parse iptc headers.
1319 my($caption,$photogr,$headln,$credit);
1321 my $str=$self->{IPTCRAW};
1325 @ar=split(/8BIM/,$str);
1330 @sar=split(/\034\002/);
1331 foreach $item (@sar) {
1332 if ($item =~ m/^x/) {
1333 $caption=&clean($item);
1336 if ($item =~ m/^P/) {
1337 $photogr=&clean($item);
1340 if ($item =~ m/^i/) {
1341 $headln=&clean($item);
1344 if ($item =~ m/^n/) {
1345 $credit=&clean($item);
1351 return (caption=>$caption,photogr=>$photogr,headln=>$headln,credit=>$credit);
1359 # Autoload methods go after =cut, and are processed by the autosplit program.
1363 # Below is the stub of documentation for your module. You better edit it!
1367 Imager - Perl extension for Generating 24 bit Images
1371 use Imager qw(init);
1374 $img = Imager->new();
1375 $img->open(file=>'image.ppm',type=>'pnm')
1376 || print "failed: ",$img->{ERRSTR},"\n";
1377 $scaled=$img->scale(xpixels=>400,ypixels=>400);
1378 $scaled->write(file=>'sc_image.ppm',type=>'pnm')
1379 || print "failed: ",$scaled->{ERRSTR},"\n";
1383 Imager is a module for creating and altering images - It is not meant
1384 as a replacement or a competitor to ImageMagick or GD. Both are
1385 excellent packages and well supported.
1389 Almost all functions take the parameters in the hash fashion.
1392 $img->open(file=>'lena.png',type=>'png');
1396 $img->open(file=>'lena.png');
1398 =head2 Basic concept
1400 An Image object is created with C<$img = Imager-E<gt>new()> Should
1401 this fail for some reason an explanation can be found in
1402 C<$Imager::ERRSTR> usually error messages are stored in
1403 C<$img-E<gt>{ERRSTR}>, but since no object is created this is the only
1404 way to give back errors. C<$Imager::ERRSTR> is also used to report
1405 all errors not directly associated with an image object. Examples:
1407 $img=Imager->new(); # This is an empty image (size is 0 by 0)
1408 $img->open(file=>'lena.png',type=>'png'); # initializes from file
1410 or if you want to create an empty image:
1412 $img=Imager->new(xsize=>400,ysize=>300,channels=>4);
1414 This example creates a completely black image of width 400 and
1415 height 300 and 4 channels.
1417 If you have an existing image, use img_set() to change it's dimensions
1418 - this will destroy any existing image data:
1420 $img->img_set(xsize=>500, ysize=>500, channels=>4);
1422 Color objects are created by calling the Imager::Color->new()
1425 $color = Imager::Color->new($red, $green, $blue);
1426 $color = Imager::Color->new($red, $green, $blue, $alpha);
1427 $color = Imager::Color->new("#C0C0FF"); # html color specification
1429 This object can then be passed to functions that require a color parameter.
1431 Coordinates in Imager have the origin in the upper left corner. The
1432 horizontal coordinate increases to the right and the vertical
1435 =head2 Reading and writing images
1437 C<$img-E<gt>read()> generally takes two parameters, 'file' and 'type'.
1438 If the type of the file can be determined from the suffix of the file
1439 it can be omitted. Format dependant parameters are: For images of
1440 type 'raw' two extra parameters are needed 'xsize' and 'ysize', if the
1441 'channel' parameter is omitted for type 'raw' it is assumed to be 3.
1442 gif and png images might have a palette are converted to truecolor bit
1443 when read. Alpha channel is preserved for png images irregardless of
1444 them being in RGB or gray colorspace. Similarly grayscale jpegs are
1445 one channel images after reading them. For jpeg images the iptc
1446 header information (stored in the APP13 header) is avaliable to some
1447 degree. You can get the raw header with C<$img-E<gt>{IPTCRAW}>, but
1448 you can also retrieve the most basic information with
1449 C<%hsh=$img-E<gt>parseiptc()> as always patches are welcome. Neither
1450 pnm nor tiff have extra options. Examples:
1452 $img = Imager->new();
1453 $img->read(file=>"cover.jpg") or die $img->errstr; # gets type from name
1455 $img = Imager->new();
1456 { local(*FH,$/); open(FH,"file.gif") or die $!; $a=<FH>; }
1457 $img->read(data=>$a,type=>'gif') or die $img->errstr;
1459 The second example shows how to read an image from a scalar, this is
1460 usefull if your data originates from somewhere else than a filesystem
1461 such as a database over a DBI connection.
1463 *Note that load() is now an alias for read but will be removed later*
1465 C<$img-E<gt>write> has the same interface as C<read()>. The earlier
1466 comments on C<read()> for autodetecting filetypes apply. For jpegs
1467 quality can be adjusted via the 'jpegquality' parameter (0-100). The
1468 number of colorplanes in gifs are set with 'gifplanes' and should be
1469 between 1 (2 color) and 8 (256 colors). It is also possible to choose
1470 between two quantizing methods with the parameter 'gifquant'. If set
1471 to mc it uses the mediancut algorithm from either giflibrary. If set
1472 to lm it uses a local means algorithm. It is then possible to give
1473 some extra settings. lmdither is the dither deviation amount in pixels
1474 (manhattan distance). lmfixed can be an array ref who holds an array
1475 of Imager::Color objects. Note that the local means algorithm needs
1476 much more cpu time but also gives considerable better results than the
1477 median cut algorithm.
1479 Currently just for gif files, you can specify various options for the
1480 conversion from Imager's internal RGB format to the target's indexed
1481 file format. If you set the gifquant option to 'gen', you can use the
1482 options specified under L<Quantization options>.
1484 To see what Imager is compiled to support the following code snippet
1488 print "@{[keys %Imager::formats]}";
1490 =head2 Multi-image files
1492 Currently just for gif files, you can create files that contain more
1497 Imager->write_multi(\%opts, @images)
1499 Where %opts describes 3 possible types of outputs:
1505 A code reference which is called with a single parameter, the data to
1506 be written. You can also specify $opts{maxbuffer} which is the
1507 maximum amount of data buffered. Note that there can be larger writes
1508 than this if the file library writes larger blocks. A smaller value
1509 maybe useful for writing to a socket for incremental display.
1513 The file descriptor to save the images to.
1517 The name of the file to write to.
1519 %opts may also include the keys from L<Gif options> and L<Quantization
1524 The current aim is to support other multiple image formats in the
1525 future, such as TIFF, and to support reading multiple images from a
1531 # ... code to put images in @images
1532 Imager->write_multi({type=>'gif',
1534 gif_delays=>[ 10 x @images ] },
1540 These options can be specified when calling write_multi() for gif
1541 files, when writing a single image with the gifquant option set to
1542 'gen', or for direct calls to i_writegif_gen and i_writegif_callback.
1544 Note that some viewers will ignore some of these options
1545 (gif_user_input in particular).
1549 =item gif_each_palette
1551 Each image in the gif file has it's own palette if this is non-zero.
1552 All but the first image has a local colour table (the first uses the
1553 global colour table.
1557 The images are written interlaced if this is non-zero.
1561 A reference to an array containing the delays between images, in 1/100
1564 =item gif_user_input
1566 A reference to an array contains user input flags. If the given flag
1567 is non-zero the image viewer should wait for input before displaying
1572 A reference to an array of image disposal methods. These define what
1573 should be done to the image before displaying the next one. These are
1574 integers, where 0 means unspecified, 1 means the image should be left
1575 in place, 2 means restore to background colour and 3 means restore to
1578 =item gif_tran_color
1580 A reference to an Imager::Color object, which is the colour to use for
1581 the palette entry used to represent transparency in the palette.
1585 A reference to an array of references to arrays which represent screen
1586 positions for each image.
1588 =item gif_loop_count
1590 If this is non-zero the Netscape loop extension block is generated,
1591 which makes the animation of the images repeat.
1593 This is currently unimplemented due to some limitations in giflib.
1597 =head2 Quantization options
1599 These options can be specified when calling write_multi() for gif
1600 files, when writing a single image with the gifquant option set to
1601 'gen', or for direct calls to i_writegif_gen and i_writegif_callback.
1607 A arrayref of colors that are fixed. Note that some color generators
1612 The type of transparency processing to perform for images with an
1613 alpha channel where the output format does not have a proper alpha
1614 channel (eg. gif). This can be any of:
1620 No transparency processing is done. (default)
1624 Pixels more transparent that tr_threshold are rendered as transparent.
1628 An error diffusion dither is done on the alpha channel. Note that
1629 this is independent of the translation performed on the colour
1630 channels, so some combinations may cause undesired artifacts.
1634 The ordered dither specified by tr_orddith is performed on the alpha
1641 The highest alpha value at which a pixel will be made transparent when
1642 transp is 'threshold'. (0-255, default 127)
1646 The type of error diffusion to perform on the alpha channel when
1647 transp is 'errdiff'. This can be any defined error diffusion type
1648 except for custom (see errdiff below).
1652 The type of ordered dither to perform on the alpha channel when transp
1653 is 'orddith'. Possible values are:
1659 A semi-random map is used. The map is the same each time. Currently
1660 the default (which may change.)
1672 horizontal line dither.
1676 vertical line dither.
1682 diagonal line dither
1688 diagonal line dither
1692 A custom dither matrix is used - see tr_map
1698 When tr_orddith is custom this defines an 8 x 8 matrix of integers
1699 representing the transparency threshold for pixels corresponding to
1700 each position. This should be a 64 element array where the first 8
1701 entries correspond to the first row of the matrix. Values should be
1706 Defines how the quantization engine will build the palette(s).
1707 Currently this is ignored if 'translate' is 'giflib', but that may
1708 change. Possible values are:
1714 Only colors supplied in 'colors' are used.
1718 The web color map is used (need url here.)
1722 The original code for generating the color map (Addi's code) is used.
1726 Other methods may be added in the future.
1730 A arrayref containing Imager::Color objects, which represents the
1731 starting set of colors to use in translating the images. webmap will
1732 ignore this. The final colors used are copied back into this array
1733 (which is expanded if necessary.)
1737 The maximum number of colors to use in the image.
1741 The method used to translate the RGB values in the source image into
1742 the colors selected by make_colors. Note that make_colors is ignored
1743 whene translate is 'giflib'.
1745 Possible values are:
1751 The giflib native quantization function is used.
1755 The closest color available is used.
1759 The pixel color is modified by perturb, and the closest color is chosen.
1763 An error diffusion dither is performed.
1767 It's possible other transate values will be added.
1771 The type of error diffusion dither to perform. These values (except
1772 for custom) can also be used in tr_errdif.
1778 Floyd-Steinberg dither
1782 Jarvis, Judice and Ninke dither
1790 Custom. If you use this you must also set errdiff_width,
1791 errdiff_height and errdiff_map.
1797 =item errdiff_height
1803 When translate is 'errdiff' and errdiff is 'custom' these define a
1804 custom error diffusion map. errdiff_width and errdiff_height define
1805 the size of the map in the arrayref in errdiff_map. errdiff_orig is
1806 an integer which indicates the current pixel position in the top row
1811 When translate is 'perturb' this is the magnitude of the random bias
1812 applied to each channel of the pixel before it is looked up in the
1817 =head2 Obtaining/setting attributes of images
1819 To get the size of an image in pixels the C<$img-E<gt>getwidth()> and
1820 C<$img-E<gt>getheight()> are used.
1822 To get the number of channels in
1823 an image C<$img-E<gt>getchannels()> is used. $img-E<gt>getmask() and
1824 $img-E<gt>setmask() are used to get/set the channel mask of the image.
1826 $mask=$img->getmask();
1827 $img->setmask(mask=>1+2); # modify red and green only
1828 $img->setmask(mask=>8); # modify alpha only
1829 $img->setmask(mask=>$mask); # restore previous mask
1831 The mask of an image describes which channels are updated when some
1832 operation is performed on an image. Naturally it is not possible to
1833 apply masks to operations like scaling that alter the dimensions of
1836 It is possible to have Imager find the number of colors in an image
1837 by using C<$img-E<gt>getcolorcount()>. It requires memory proportionally
1838 to the number of colors in the image so it is possible to have it
1839 stop sooner if you only need to know if there are more than a certain number
1840 of colors in the image. If there are more colors than asked for
1841 the function return undef. Examples:
1843 if (!defined($img->getcolorcount(maxcolors=>512)) {
1844 print "Less than 512 colors in image\n";
1847 =head2 Drawing Methods
1849 IMPLEMENTATION MORE OR LESS DONE CHECK THE TESTS
1851 DOCUMENTATION OF THIS SECTION OUT OF SYNC
1853 It is possible to draw with graphics primitives onto images. Such
1854 primitives include boxes, arcs, circles and lines. A reference
1855 oriented list follows.
1858 $img->box(color=>$blue,xmin=>10,ymin=>30,xmax=>200,ymax=>300,filled=>1);
1860 The above example calls the C<box> method for the image and the box
1861 covers the pixels with in the rectangle specified. If C<filled> is
1862 ommited it is drawn as an outline. If any of the edges of the box are
1863 ommited it will snap to the outer edge of the image in that direction.
1864 Also if a color is omitted a color with (255,255,255,255) is used
1868 $img->arc(color=>$red, r=20, x=>200, y=>100, d1=>10, d2=>20 );
1870 This creates a filled red arc with a 'center' at (200, 100) and spans
1871 10 degrees and the slice has a radius of 20. SEE section on BUGS.
1874 $img->circle(color=>$green, r=50, x=>200, y=>100);
1876 This creates a green circle with its center at (200, 100) and has a
1880 $img->line(color=>$green, x1=10, x2=>100,
1881 y1=>20, y2=>50, antialias=>1 );
1883 That draws an antialiased line from (10,100) to (20,50).
1886 $img->polyline(points=>[[$x0,$y0],[$x1,$y1],[$x2,$y2]],color=>$red);
1887 $img->polyline(x=>[$x0,$x1,$x2], y=>[$y0,$y1,$y2], antialias=>1);
1889 Polyline is used to draw multilple lines between a series of points.
1890 The point set can either be specified as an arrayref to an array of
1891 array references (where each such array represents a point). The
1892 other way is to specify two array references.
1894 =head2 Text rendering
1896 Text rendering is described in the Imager::Font manpage.
1898 =head2 Image resizing
1900 To scale an image so porportions are maintained use the
1901 C<$img-E<gt>scale()> method. if you give either a xpixels or ypixels
1902 parameter they will determine the width or height respectively. If
1903 both are given the one resulting in a larger image is used. example:
1904 C<$img> is 700 pixels wide and 500 pixels tall.
1906 $img->scale(xpixels=>400); # 400x285
1907 $img->scale(ypixels=>400); # 560x400
1909 $img->scale(xpixels=>400,ypixels=>400); # 560x400
1910 $img->scale(xpixels=>400,ypixels=>400,type=>min); # 400x285
1912 $img->scale(scalefactor=>0.25); 175x125 $img->scale(); # 350x250
1914 if you want to create low quality previews of images you can pass
1915 C<qtype=E<gt>'preview'> to scale and it will use nearest neighbor
1916 sampling instead of filtering. It is much faster but also generates
1917 worse looking images - especially if the original has a lot of sharp
1918 variations and the scaled image is by more than 3-5 times smaller than
1921 If you need to scale images per axis it is best to do it simply by
1922 calling scaleX and scaleY. You can pass either 'scalefactor' or
1923 'pixels' to both functions.
1925 Another way to resize an image size is to crop it. The parameters
1926 to crop are the edges of the area that you want in the returned image.
1927 If a parameter is omited a default is used instead.
1929 $newimg = $img->crop(left=>50, right=>100, top=>10, bottom=>100);
1930 $newimg = $img->crop(left=>50, top=>10, width=>50, height=>90);
1931 $newimg = $img->crop(left=>50, right=>100); # top
1933 You can also specify width and height parameters which will produce a
1934 new image cropped from the center of the input image, with the given
1937 $newimg = $img->crop(width=>50, height=>50);
1939 The width and height parameters take precedence over the left/right
1940 and top/bottom parameters respectively.
1942 =head2 Copying images
1944 To create a copy of an image use the C<copy()> method. This is usefull
1945 if you want to keep an original after doing something that changes the image
1946 inplace like writing text.
1950 To copy an image to onto another image use the C<paste()> method.
1952 $dest->paste(left=>40,top=>20,img=>$logo);
1954 That copies the entire C<$logo> image onto the C<$dest> image so that the
1955 upper left corner of the C<$logo> image is at (40,20).
1957 =head2 Blending Images
1959 To put an image or a part of an image directly into another it is
1960 best to call the C<paste()> method on the image you want to add to.
1962 $img->paste(img=>$srcimage,left=>30,top=>50);
1964 That will take paste C<$srcimage> into C<$img> with the upper
1965 left corner at (30,50). If no values are given for C<left>
1966 or C<top> they will default to 0.
1968 A more complicated way of blending images is where one image is
1969 put 'over' the other with a certain amount of opaqueness. The
1970 method that does this is rubthrough.
1972 $img->rubthrough(src=>$srcimage,tx=>30,ty=>50);
1974 That will take the image C<$srcimage> and overlay it with the
1975 upper left corner at (30,50). The C<$srcimage> must be a 4 channel
1976 image. The last channel is used as an alpha channel.
1981 A special image method is the filter method. An example is:
1983 $img->filter(type=>'autolevels');
1985 This will call the autolevels filter. Here is a list of the filters
1986 that are always avaliable in Imager. This list can be obtained by
1987 running the C<filterlist.perl> script that comes with the module
1992 autolevels lsat(0.1) usat(0.1) skew(0)
1994 noise amount(3) subtype(0)
1997 gradgen xo yo colors dist
1999 The default values are in parenthesis. All parameters must have some
2000 value but if a parameter has a default value it may be omitted when
2001 calling the filter function.
2003 FIXME: make a seperate pod for filters?
2005 =head2 Transformations
2007 Another special image method is transform. It can be used to generate
2008 warps and rotations and such features. It can be given the operations
2009 in postfix notation or the module Affix::Infix2Postfix can be used.
2010 Look in the test case t/t55trans.t for an example.
2012 transform() needs expressions (or opcodes) that determine the source
2013 pixel for each target pixel. Source expressions are infix expressions
2014 using any of the +, -, *, / or ** binary operators, the - unary
2015 operator, ( and ) for grouping and the sin() and cos() functions. The
2016 target pixel is input as the variables x and y.
2018 You specify the x and y expressions as xexpr and yexpr respectively.
2019 You can also specify opcodes directly, but that's magic deep enough
2020 that you can look at the source code.
2022 You can still use the transform() function, but the transform2()
2023 function is just as fast and is more likely to be enhanced and
2026 Later versions of Imager also support a transform2() class method
2027 which allows you perform a more general set of operations, rather than
2028 just specifying a spatial transformation as with the transform()
2029 method, you can also perform colour transformations, image synthesis
2030 and image combinations.
2032 transform2() takes an reference to an options hash, and a list of
2033 images to operate one (this list may be empty):
2038 my $img = Imager::transform2(\%opts, @imgs)
2039 or die "transform2 failed: $Imager::ERRSTR";
2041 The options hash may define a transformation function, and optionally:
2047 width - the width of the image in pixels. If this isn't supplied the
2048 width of the first input image is used. If there are no input images
2053 height - the height of the image in pixels. If this isn't supplied
2054 the height of the first input image is used. If there are no input
2055 images an error occurs.
2059 constants - a reference to hash of constants to define for the
2060 expression engine. Some extra constants are defined by Imager
2064 The tranformation function is specified using either the expr or
2065 rpnexpr member of the options.
2069 =item Infix expressions
2071 You can supply infix expressions to transform 2 with the expr keyword.
2073 $opts{expr} = 'return getp1(w-x, h-y)'
2075 The 'expression' supplied follows this general grammar:
2077 ( identifier '=' expr ';' )* 'return' expr
2079 This allows you to simplify your expressions using variables.
2081 A more complex example might be:
2083 $opts{expr} = 'pix = getp1(x,y); return if(value(pix)>0.8,pix*0.8,pix)'
2085 Currently to use infix expressions you must have the Parse::RecDescent
2086 module installed (available from CPAN). There is also what might be a
2087 significant delay the first time you run the infix expression parser
2088 due to the compilation of the expression grammar.
2090 =item Postfix expressions
2092 You can supply postfix or reverse-polish notation expressions to
2093 transform2() through the rpnexpr keyword.
2095 The parser for rpnexpr emulates a stack machine, so operators will
2096 expect to see their parameters on top of the stack. A stack machine
2097 isn't actually used during the image transformation itself.
2099 You can store the value at the top of the stack in a variable called
2100 foo using !foo and retrieve that value again using @foo. The !foo
2101 notation will pop the value from the stack.
2103 An example equivalent to the infix expression above:
2105 $opts{rpnexpr} = 'x y getp1 !pix @pix value 0.8 gt @pix 0.8 * @pix ifp'
2109 transform2() has a fairly rich range of operators.
2113 =item +, *, -, /, %, **
2115 multiplication, addition, subtraction, division, remainder and
2116 exponentiation. Multiplication, addition and subtraction can be used
2117 on colour values too - though you need to be careful - adding 2 white
2118 values together and multiplying by 0.5 will give you grey, not white.
2120 Division by zero (or a small number) just results in a large number.
2121 Modulo zero (or a small number) results in zero.
2123 =item sin(N), cos(N), atan2(y,x)
2125 Some basic trig functions. They work in radians, so you can't just
2128 =item distance(x1, y1, x2, y2)
2130 Find the distance between two points. This is handy (along with
2131 atan2()) for producing circular effects.
2135 Find the square root. I haven't had much use for this since adding
2136 the distance() function.
2140 Find the absolute value.
2142 =item getp1(x,y), getp2(x,y), getp3(x, y)
2144 Get the pixel at position (x,y) from the first, second or third image
2145 respectively. I may add a getpn() function at some point, but this
2146 prevents static checking of the instructions against the number of
2147 images actually passed in.
2149 =item value(c), hue(c), sat(c), hsv(h,s,v)
2151 Separates a colour value into it's value (brightness), hue (colour)
2152 and saturation elements. Use hsv() to put them back together (after
2153 suitable manipulation).
2155 =item red(c), green(c), blue(c), rgb(r,g,b)
2157 Separates a colour value into it's red, green and blue colours. Use
2158 rgb(r,g,b) to put it back together.
2162 Convert a value to an integer. Uses a C int cast, so it may break on
2165 =item if(cond,ntrue,nfalse), if(cond,ctrue,cfalse)
2167 A simple (and inefficient) if function.
2169 =item <=,<,==,>=,>,!=
2171 Relational operators (typically used with if()). Since we're working
2172 with floating point values the equalities are 'near equalities' - an
2173 epsilon value is used.
2175 =item &&, ||, not(n)
2177 Basic logical operators.
2185 =item rpnexpr=>'x 25 % 15 * y 35 % 10 * getp1 !pat x y getp1 !pix @pix sat 0.7 gt @pat @pix ifp'
2187 tiles a smaller version of the input image over itself where the colour has a saturation over 0.7.
2189 =item rpnexpr=>'x 25 % 15 * y 35 % 10 * getp1 !pat y 360 / !rat x y getp1 1 @rat - pmult @pat @rat pmult padd'
2191 tiles the input image over itself so that at the top of the image the
2192 full-size image is at full strength and at the bottom the tiling is
2195 =item rpnexpr=>'x y getp1 !pix @pix value 0.96 gt @pix sat 0.1 lt and 128 128 255 rgb @pix ifp'
2197 replace pixels that are white or almost white with a palish blue
2199 =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'
2201 Tiles the input image overitself where the image isn't white or almost
2204 =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'
2208 =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'
2210 A spiral built on top of a colour wheel.
2214 For details on expression parsing see L<Imager::Expr>. For details on
2215 the virtual machine used to transform the images, see
2216 L<Imager::regmach.pod>.
2220 It is possible to add filters to the module without recompiling the
2221 module itself. This is done by using DSOs (Dynamic shared object)
2222 avaliable on most systems. This way you can maintain our own filters
2223 and not have to get me to add it, or worse patch every new version of
2224 the Module. Modules can be loaded AND UNLOADED at runtime. This
2225 means that you can have a server/daemon thingy that can do something
2228 load_plugin("dynfilt/dyntest.so") || die "unable to load plugin\n";
2229 %hsh=(a=>35,b=>200,type=>lin_stretch);
2231 unload_plugin("dynfilt/dyntest.so") || die "unable to load plugin\n";
2232 $img->write(type=>'pnm',file=>'testout/t60.jpg')
2233 || die "error in write()\n";
2235 Someone decides that the filter is not working as it should -
2236 dyntest.c modified and recompiled.
2238 load_plugin("dynfilt/dyntest.so") || die "unable to load plugin\n";
2241 An example plugin comes with the module - Please send feedback to
2242 addi@umich.edu if you test this.
2244 Note: This seems to test ok on the following systems:
2245 Linux, Solaris, HPUX, OpenBSD, FreeBSD, TRU64/OSF1, AIX.
2246 If you test this on other systems please let me know.
2250 box, arc, circle do not support antialiasing yet. arc, is only filled
2251 as of yet. Some routines do not return $self where they should. This
2252 affects code like this, C<$img-E<gt>box()-E<gt>arc()> where an object
2255 When saving Gif images the program does NOT try to shave of extra
2256 colors if it is possible. If you specify 128 colors and there are
2257 only 2 colors used - it will have a 128 colortable anyway.
2261 Arnar M. Hrafnkelsson, addi@umich.edu
2262 And a great deal of help from others - see the README for a complete
2266 perl(1), Imager::Color(3), Affix::Infix2Postfix(3), Parse::RecDescent(3)
2267 http://www.eecs.umich.edu/~addi/perl/Imager/