diff options
Diffstat (limited to 'perllib/FixMyStreet/ImageMagick.pm')
-rw-r--r-- | perllib/FixMyStreet/ImageMagick.pm | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/perllib/FixMyStreet/ImageMagick.pm b/perllib/FixMyStreet/ImageMagick.pm new file mode 100644 index 000000000..26c5c6d74 --- /dev/null +++ b/perllib/FixMyStreet/ImageMagick.pm @@ -0,0 +1,68 @@ +package FixMyStreet::ImageMagick; + +use Moo; + +my $IM = eval { + require Image::Magick; + Image::Magick->import; + 1; +}; + +has blob => ( is => 'ro' ); + +has image => ( + is => 'rwp', + lazy => 1, + default => sub { + my $self = shift; + return unless $IM; + my $image = Image::Magick->new; + $image->BlobToImage($self->blob); + return $image; + }, +); + +sub strip { + my $self = shift; + return $self unless $self->image; + $self->image->Strip(); + return $self; +} + +sub rotate { + my ($self, $direction) = @_; + return $self unless $self->image; + my $err = $self->image->Rotate($direction); + return 0 if $err; + return $self; +} + +# Shrinks a picture to the specified size, but keeping in proportion. +sub shrink { + my ($self, $size) = @_; + return $self unless $self->image; + my $err = $self->image->Scale(geometry => "$size>"); + throw Error::Simple("resize failed: $err") if "$err"; + return $self->strip; +} + +# Shrinks a picture to 90x60, cropping so that it is exactly that. +sub crop { + my $self = shift; + return $self unless $self->image; + my $err = $self->image->Resize( geometry => "90x60^" ); + throw Error::Simple("resize failed: $err") if "$err"; + $err = $self->image->Extent( geometry => '90x60', gravity => 'Center' ); + throw Error::Simple("resize failed: $err") if "$err"; + return $self->strip; +} + +sub as_blob { + my $self = shift; + return $self->blob unless $self->image; + my @blobs = $self->image->ImageToBlob(); + $self->_set_image(undef); + return $blobs[0]; +} + +1; |