BEGIN {
require Exporter;
- require DynaLoader;
-
- $VERSION = '0.45';
- @ISA = qw(Exporter DynaLoader);
- bootstrap Imager $VERSION;
+ @ISA = qw(Exporter);
+ $VERSION = '0.47';
+ eval {
+ require XSLoader;
+ XSLoader::load(Imager => $VERSION);
+ 1;
+ } or do {
+ require DynaLoader;
+ push @ISA, 'DynaLoader';
+ bootstrap Imager $VERSION;
+ }
}
BEGIN {
}
my $newcopy=Imager->new();
- $newcopy->{IMG}=i_img_new();
- i_copy($newcopy->{IMG},$self->{IMG});
+ $newcopy->{IMG} = i_copy($self->{IMG});
return $newcopy;
}
sub paste {
my $self = shift;
- unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
- my %input=(left=>0, top=>0, @_);
- unless($input{img}) {
- $self->{ERRSTR}="no source image";
+
+ unless ($self->{IMG}) {
+ $self->_set_error('empty input image');
+ return;
+ }
+ my %input=(left=>0, top=>0, src_minx => 0, src_miny => 0, @_);
+ my $src = $input{img} || $input{src};
+ unless($src) {
+ $self->_set_error("no source image");
return;
}
$input{left}=0 if $input{left} <= 0;
$input{top}=0 if $input{top} <= 0;
- my $src=$input{img};
+
my($r,$b)=i_img_info($src->{IMG});
+ my ($src_left, $src_top) = @input{qw/src_minx src_miny/};
+ my ($src_right, $src_bottom);
+ if ($input{src_coords}) {
+ ($src_left, $src_top, $src_right, $src_bottom) = @{$input{src_coords}}
+ }
+ else {
+ if (defined $input{src_maxx}) {
+ $src_right = $input{src_maxx};
+ }
+ elsif (defined $input{width}) {
+ if ($input{width} <= 0) {
+ $self->_set_error("paste: width must me positive");
+ return;
+ }
+ $src_right = $src_left + $input{width};
+ }
+ else {
+ $src_right = $r;
+ }
+ if (defined $input{src_maxx}) {
+ $src_bottom = $input{src_maxy};
+ }
+ elsif (defined $input{height}) {
+ if ($input{height} < 0) {
+ $self->_set_error("paste: height must be positive");
+ return;
+ }
+ $src_bottom = $src_top + $input{height};
+ }
+ else {
+ $src_bottom = $b;
+ }
+ }
+
+ $src_right > $r and $src_right = $r;
+ $src_bottom > $r and $src_bottom = $b;
+
+ if ($src_right <= $src_left
+ || $src_bottom < $src_top) {
+ $self->_set_error("nothing to paste");
+ return;
+ }
i_copyto($self->{IMG}, $src->{IMG},
- 0,0, $r, $b, $input{left}, $input{top});
+ $src_left, $src_top, $src_right, $src_bottom,
+ $input{left}, $input{top});
+
return $self; # What should go here??
}
if ( $input{'type'} eq 'pnm' ) {
$self->{IMG}=i_readpnm_wiol( $IO, -1 ); # Fixme, check if that length parameter is ever needed
if ( !defined($self->{IMG}) ) {
- $self->{ERRSTR}='unable to read pnm image: '._error_as_msg(); return undef;
+ $self->{ERRSTR}='unable to read pnm image: '._error_as_msg();
+ return undef;
}
$self->{DEBUG} && print "loading a pnm file\n";
return $self;
$params{storechannels},
$params{interleave});
if ( !defined($self->{IMG}) ) {
- $self->{ERRSTR}='unable to read raw image';
+ $self->{ERRSTR}=$self->_error_as_msg();
return undef;
}
$self->{DEBUG} && print "loading a raw file\n";
if (defined $input{class} && $input{class} eq 'fax') {
if (!i_writetiff_wiol_faxable($self->{IMG}, $IO, $input{fax_fine})) {
- $self->{ERRSTR}='Could not write to buffer';
+ $self->{ERRSTR} = $self->_error_as_msg();
return undef;
}
} else {
if (!i_writetiff_wiol($self->{IMG}, $IO)) {
- $self->{ERRSTR}='Could not write to buffer';
+ $self->{ERRSTR} = $self->_error_as_msg();
return undef;
}
}
$self->_set_opts(\%input, "pnm_", $self)
or return undef;
if ( ! i_writeppm_wiol($self->{IMG},$IO) ) {
- $self->{ERRSTR}='unable to write pnm image';
+ $self->{ERRSTR} = $self->_error_as_msg();
return undef;
}
$self->{DEBUG} && print "writing a pnm file\n";
$self->_set_opts(\%input, "raw_", $self)
or return undef;
if ( !i_writeraw_wiol($self->{IMG},$IO) ) {
- $self->{ERRSTR}='unable to write raw image';
+ $self->{ERRSTR} = $self->_error_as_msg();
return undef;
}
$self->{DEBUG} && print "writing a raw file\n";
}
}
if (defined($filters{$input{'type'}}{defaults})) {
- %hsh=('image',$self->{IMG},%{$filters{$input{'type'}}{defaults}},%input);
+ %hsh=( image => $self->{IMG},
+ imager => $self,
+ %{$filters{$input{'type'}}{defaults}},
+ %input );
} else {
- %hsh=('image',$self->{IMG},%input);
+ %hsh=( image => $self->{IMG},
+ imager => $self,
+ %input );
}
my @cs=@{$filters{$input{'type'}}{callseq}};
return $self;
}
+sub register_filter {
+ my $class = shift;
+ my %hsh = ( defaults => {}, @_ );
+
+ defined $hsh{type}
+ or die "register_filter() with no type\n";
+ defined $hsh{callsub}
+ or die "register_filter() with no callsub\n";
+ defined $hsh{callseq}
+ or die "register_filter() with no callseq\n";
+
+ exists $filters{$hsh{type}}
+ and return;
+
+ $filters{$hsh{type}} = \%hsh;
+
+ return 1;
+}
+
# Scale an image to requested size and return the scaled version
sub scale {
return;
}
- unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
+ unless ($self->{IMG}) {
+ $self->_set_error('empty input image');
+ return undef;
+ }
+ # work out the scaling
if ($opts{xpixels} and $opts{ypixels} and $opts{'type'}) {
- my ($xpix,$ypix)=( $opts{xpixels}/$self->getwidth() , $opts{ypixels}/$self->getheight() );
- if ($opts{'type'} eq 'min') { $opts{scalefactor}=min($xpix,$ypix); }
- if ($opts{'type'} eq 'max') { $opts{scalefactor}=max($xpix,$ypix); }
- } elsif ($opts{xpixels}) { $opts{scalefactor}=$opts{xpixels}/$self->getwidth(); }
- elsif ($opts{ypixels}) { $opts{scalefactor}=$opts{ypixels}/$self->getheight(); }
+ my ($xpix, $ypix)=( $opts{xpixels}/$self->getwidth() ,
+ $opts{ypixels}/$self->getheight() );
+ if ($opts{'type'} eq 'min') {
+ $opts{scalefactor}=min($xpix,$ypix);
+ }
+ elsif ($opts{'type'} eq 'max') {
+ $opts{scalefactor}=max($xpix,$ypix);
+ }
+ else {
+ $self->_set_error('invalid value for type parameter');
+ return undef;
+ }
+ } elsif ($opts{xpixels}) {
+ $opts{scalefactor}=$opts{xpixels}/$self->getwidth();
+ }
+ elsif ($opts{ypixels}) {
+ $opts{scalefactor}=$opts{ypixels}/$self->getheight();
+ }
if ($opts{qtype} eq 'normal') {
$tmp->{IMG}=i_scaleaxis($self->{IMG},$opts{scalefactor},0);
- if ( !defined($tmp->{IMG}) ) { $self->{ERRSTR}='unable to scale image'; return undef; }
+ if ( !defined($tmp->{IMG}) ) {
+ $self->{ERRSTR}='unable to scale image';
+ return undef;
+ }
$img->{IMG}=i_scaleaxis($tmp->{IMG},$opts{scalefactor},1);
- if ( !defined($img->{IMG}) ) { $self->{ERRSTR}='unable to scale image'; return undef; }
+ if ( !defined($img->{IMG}) ) {
+ $self->{ERRSTR}='unable to scale image';
+ return undef;
+ }
+
return $img;
}
- if ($opts{'qtype'} eq 'preview') {
- $img->{IMG}=i_scale_nn($self->{IMG},$opts{'scalefactor'},$opts{'scalefactor'});
- if ( !defined($img->{IMG}) ) { $self->{ERRSTR}='unable to scale image'; return undef; }
+ elsif ($opts{'qtype'} eq 'preview') {
+ $img->{IMG} = i_scale_nn($self->{IMG}, $opts{'scalefactor'},
+ $opts{'scalefactor'});
+ if ( !defined($img->{IMG}) ) {
+ $self->{ERRSTR}='unable to scale image';
+ return undef;
+ }
return $img;
}
- $self->{ERRSTR}='scale: invalid value for qtype'; return undef;
+ else {
+ $self->_set_error('invalid value for qtype parameter');
+ return undef;
+ }
}
# Scales only along the X axis
return $self;
}
-# Draws an arc - this routine SUCKS and is buggy - it sometimes doesn't work when the arc is a convex polygon
-
sub arc {
my $self=shift;
unless ($self->{IMG}) { $self->{ERRSTR}='empty input image'; return undef; }
'x'=>$self->getwidth()/2,
'y'=>$self->getheight()/2,
'd1'=>0, 'd2'=>361, @_);
- if ($opts{fill}) {
- unless (UNIVERSAL::isa($opts{fill}, 'Imager::Fill')) {
- # assume it's a hash ref
- require 'Imager/Fill.pm';
- unless ($opts{fill} = Imager::Fill->new(%{$opts{fill}})) {
- $self->{ERRSTR} = $Imager::ERRSTR;
- return;
+ if ($opts{aa}) {
+ if ($opts{fill}) {
+ unless (UNIVERSAL::isa($opts{fill}, 'Imager::Fill')) {
+ # assume it's a hash ref
+ require 'Imager/Fill.pm';
+ unless ($opts{fill} = Imager::Fill->new(%{$opts{fill}})) {
+ $self->{ERRSTR} = $Imager::ERRSTR;
+ return;
+ }
+ }
+ i_arc_aa_cfill($self->{IMG},$opts{'x'},$opts{'y'},$opts{'r'},$opts{'d1'},
+ $opts{'d2'}, $opts{fill}{fill});
+ }
+ else {
+ my $color = _color($opts{'color'});
+ unless ($color) {
+ $self->{ERRSTR} = $Imager::ERRSTR;
+ return;
+ }
+ if ($opts{d1} == 0 && $opts{d2} == 361 && $opts{aa}) {
+ i_circle_aa($self->{IMG}, $opts{'x'}, $opts{'y'}, $opts{'r'},
+ $color);
+ }
+ else {
+ i_arc_aa($self->{IMG},$opts{'x'},$opts{'y'},$opts{'r'},
+ $opts{'d1'}, $opts{'d2'}, $color);
}
}
- i_arc_cfill($self->{IMG},$opts{'x'},$opts{'y'},$opts{'r'},$opts{'d1'},
- $opts{'d2'}, $opts{fill}{fill});
}
else {
- my $color = _color($opts{'color'});
- unless ($color) {
- $self->{ERRSTR} = $Imager::ERRSTR;
- return;
- }
- if ($opts{d1} == 0 && $opts{d2} == 361 && $opts{aa}) {
- i_circle_aa($self->{IMG}, $opts{'x'}, $opts{'y'}, $opts{'r'},
- $color);
+ if ($opts{fill}) {
+ unless (UNIVERSAL::isa($opts{fill}, 'Imager::Fill')) {
+ # assume it's a hash ref
+ require 'Imager/Fill.pm';
+ unless ($opts{fill} = Imager::Fill->new(%{$opts{fill}})) {
+ $self->{ERRSTR} = $Imager::ERRSTR;
+ return;
+ }
+ }
+ i_arc_cfill($self->{IMG},$opts{'x'},$opts{'y'},$opts{'r'},$opts{'d1'},
+ $opts{'d2'}, $opts{fill}{fill});
}
else {
- if ($opts{'d1'} <= $opts{'d2'}) {
- i_arc($self->{IMG},$opts{'x'},$opts{'y'},$opts{'r'},
- $opts{'d1'}, $opts{'d2'}, $color);
- }
- else {
- i_arc($self->{IMG},$opts{'x'},$opts{'y'},$opts{'r'},
- $opts{'d1'}, 361, $color);
- i_arc($self->{IMG},$opts{'x'},$opts{'y'},$opts{'r'},
- 0, $opts{'d2'}, $color);
+ my $color = _color($opts{'color'});
+ unless ($color) {
+ $self->{ERRSTR} = $Imager::ERRSTR;
+ return;
}
+ i_arc($self->{IMG},$opts{'x'},$opts{'y'},$opts{'r'},
+ $opts{'d1'}, $opts{'d2'}, $color);
}
}
my %input=('x'=>0, 'y'=>0, @_);
$input{string}||=$input{text};
- unless(exists $input{string}) {
+ unless(defined $input{string}) {
$self->{ERRSTR}="missing required parameter 'string'";
return;
}
}
unless ($input{font}->draw(image=>$self, %input)) {
- $self->{ERRSTR} = $self->_error_as_msg();
return;
}
return $self;
}
+sub align_string {
+ my $self = shift;
+
+ my $img;
+ if (ref $self) {
+ unless ($self->{IMG}) {
+ $self->{ERRSTR}='empty input image';
+ return;
+ }
+ $img = $self;
+ }
+ else {
+ $img = undef;
+ }
+
+ my %input=('x'=>0, 'y'=>0, @_);
+ $input{string}||=$input{text};
+
+ unless(exists $input{string}) {
+ $self->_set_error("missing required parameter 'string'");
+ return;
+ }
+
+ unless($input{font}) {
+ $self->_set_error("missing required parameter 'font'");
+ return;
+ }
+
+ my @result;
+ unless (@result = $input{font}->align(image=>$img, %input)) {
+ return;
+ }
+
+ return wantarray ? @result : $result[0];
+}
+
my @file_limit_names = qw/width height bytes/;
sub set_file_limits {
return (caption=>$caption,photogr=>$photogr,headln=>$headln,credit=>$credit);
}
-# Autoload methods go after =cut, and are processed by the autosplit program.
+sub Inline {
+ my ($lang) = @_;
+
+ $lang eq 'C'
+ or die "Only C language supported";
+
+ require Imager::ExtUtils;
+ return Imager::ExtUtils->inline_config;
+}
1;
__END__
L<Imager::Fountain> - Helper for making gradient profiles.
+=item *
+
+L<Imager::API> - using Imager's C API
+
+=item *
+
+L<Imager::APIRef> - API function reference
+
+=item *
+
+L<Imager::Inline> - using Imager's C API from Inline::C
+
+=item *
+
+L<Imager::ExtUtils> - tools to get access to Imager's C API.
+
=back
=head2 Basic Overview
arc() - L<Imager::Draw/arc>
+align_string() - L<Imager::Draw/align_string>
+
bits() - L<Imager::ImageTypes/bits> - number of bits per sample for the
image
difference() - L<Imager::Filters/"Image Difference">
-errstr() - L<Imager/"Basic Overview">
+errstr() - L<"Basic Overview">
filter() - L<Imager::Filters>
getheight() - L<Imager::ImageTypes/getwidth>
-getpixel() - L<Imager::Draw/setpixel and getpixel>
+getpixel() - L<Imager::Draw/getpixel>
getsamples() - L<Imager::Draw/getsamples>
setcolors() - L<Imager::ImageTypes/setcolors> - set palette colors in
a paletted image
-setpixel() - L<Imager::Draw/setpixel and getpixel>
+setpixel() - L<Imager::Draw/setpixel>
set_file_limits() - L<Imager::Files/"Limiting the sizes of images you read">
-string() - L<Imager::Font/string> - draw text on an image
+string() - L<Imager::Draw/string> - draw text on an image
tags() - L<Imager::ImageTypes/tags> - fetch image tags
aspect ratio - L<Imager::ImageTypes/i_xres>,
L<Imager::ImageTypes/i_yres>, L<Imager::ImageTypes/i_aspect_only>
+blend - alpha blending one image onto another
+L<Imager::Transformations/rubthrough>
+
blur - L<Imager::Filters/guassian>, L<Imager::Filters/conv>
boxes, drawing - L<Imager::Draw/box>
+changes between image - L<Imager::Filter/"Image Difference">
+
color - L<Imager::Color>
color names - L<Imager::Color>, L<Imager::Color::Table>
combine modes - L<Imager::Fill/combine>
+compare images - L<Imager::Filter/"Image Difference">
+
contrast - L<Imager::Filter/contrast>, L<Imager::Filter/autolevels>
convolution - L<Imager::Filter/conv>
cropping - L<Imager::Transformations/crop>
+C<diff> images - L<Imager::Filter/"Image Difference">
+
dpi - L<Imager::ImageTypes/i_xres>
drawing boxes - L<Imager::Draw/box>
drawing text - L<Imager::Font/string>, L<Imager::Font/align>
-error message - L<Imager/"Basic Overview">
+error message - L<"Basic Overview">
files, font - L<Imager::Font>
noise, rendered - L<Imager::Filter/turbnoise>,
L<Imager::Filter/radnoise>
+paste - L<Imager::Transformations/paste>,
+L<Imager::Transformations/rubthrough>
+
pseudo-color image - L<Imager::ImageTypes/to_paletted>,
L<Imager::ImageTypes/new>
tags, image metadata - L<Imager::ImageTypes/"Tags">
-text, drawing - L<Imager::Font/string>, L<Imager::Font/align>,
+text, drawing - L<Imager::Draw/string>, L<Imager::Draw/align_string>,
L<Imager::Font::Wrap>
text, wrapping text in an area - L<Imager::Font::Wrap>
watermark - L<Imager::Filter/watermark>
-writing an image - L<Imager::Files>
+writing an image to a file - L<Imager::Files>
=head1 SUPPORT
or use the form at:
- http://www.molar.is/en/lists/imager-devel/
- (annonymous is temporarily off due to spam)
+=over
+
+L<http://www.molar.is/en/lists/imager-devel/>
+
+=back
where you can also find the mailing list archive.
You can report bugs by pointing your browser at:
- https://rt.cpan.org/NoAuth/ReportBug.html?Queue=Imager
+=over
+
+L<https://rt.cpan.org/NoAuth/ReportBug.html?Queue=Imager>
+
+=back
Please remember to include the versions of Imager, perl, supporting
libraries, and any relevant code. If you have specific images that
=head1 SEE ALSO
-perl(1), Imager::ImageTypes(3), Imager::Files(3), Imager::Draw(3),
-Imager::Color(3), Imager::Fill(3), Imager::Font(3),
-Imager::Transformations(3), Imager::Engines(3), Imager::Filters(3),
-Imager::Expr(3), Imager::Matrix2d(3), Imager::Fountain(3)
+L<perl>(1), L<Imager::ImageTypes>(3), L<Imager::Files>(3),
+L<Imager::Draw>(3), L<Imager::Color>(3), L<Imager::Fill>(3),
+L<Imager::Font>(3), L<Imager::Transformations>(3),
+L<Imager::Engines>(3), L<Imager::Filters>(3), L<Imager::Expr>(3),
+L<Imager::Matrix2d>(3), L<Imager::Fountain>(3)
+
+L<http://imager.perl.org/>
-Affix::Infix2Postfix(3), Parse::RecDescent(3)
-http://imager.perl.org/
+L<Affix::Infix2Postfix>(3), L<Parse::RecDescent>(3)
Other perl imaging modules include:
-GD(3), Image::Magick(3), Graphics::Magick(3).
+L<GD>(3), L<Image::Magick>(3), L<Graphics::Magick>(3).
=cut