diff options
author | Matthew Somerville <matthew-github@dracos.co.uk> | 2018-11-13 12:03:22 +0000 |
---|---|---|
committer | Matthew Somerville <matthew-github@dracos.co.uk> | 2018-11-14 13:54:02 +0000 |
commit | b43337ac91ef095c59cc48d4dbeeefb2d53a1698 (patch) | |
tree | 3135e0f56c064580e4e3586b74dc8ef4af28f25d | |
parent | c4cb0a4d2754c2a5ead4fcb6300c473aa8357b95 (diff) |
Factor out ImageMagick wrapper.
-rw-r--r-- | perllib/FixMyStreet/App/Model/PhotoSet.pm | 59 | ||||
-rw-r--r-- | perllib/FixMyStreet/ImageMagick.pm | 68 |
2 files changed, 74 insertions, 53 deletions
diff --git a/perllib/FixMyStreet/App/Model/PhotoSet.pm b/perllib/FixMyStreet/App/Model/PhotoSet.pm index f209a2aed..284c7569d 100644 --- a/perllib/FixMyStreet/App/Model/PhotoSet.pm +++ b/perllib/FixMyStreet/App/Model/PhotoSet.pm @@ -4,12 +4,6 @@ package FixMyStreet::App::Model::PhotoSet; use Moose; -my $IM = eval { - require Image::Magick; - Image::Magick->import; - 1; -}; - use Scalar::Util 'openhandle', 'blessed'; use Image::Size; use IPC::Cmd qw(can_run); @@ -17,6 +11,7 @@ use IPC::Open3; use MIME::Base64; use FixMyStreet; +use FixMyStreet::ImageMagick; use FixMyStreet::PhotoStorage; # Attached Catalyst app, if present, for feeding back errors during photo upload @@ -221,14 +216,15 @@ sub get_image_data { return $image; } + my $im = FixMyStreet::ImageMagick->new(blob => $photo); if ( $size eq 'tn' ) { - $photo = _shrink( $photo, 'x100' ); + $photo = $im->shrink('x100')->as_blob; } elsif ( $size eq 'fp' ) { - $photo = _crop( $photo ); + $photo = $im->crop->as_blob; } elsif ( $size eq 'full' ) { # do nothing } else { - $photo = _shrink( $photo, $args{default} || '250x250' ); + $photo = $im->shrink($args{default} || '250x250')->as_blob; } return { @@ -290,7 +286,7 @@ sub rotate_image { return if $index > $#images; my $image = $self->get_raw_image($index); - $images[$index] = _rotate_image( $image->{data}, $direction ); + $images[$index] = FixMyStreet::ImageMagick->new(blob => $image->{data})->rotate($direction)->as_blob; my $new_set = (ref $self)->new({ data_items => \@images, @@ -302,47 +298,4 @@ sub rotate_image { return $new_set->data; # e.g. new comma-separated fileid } -sub _rotate_image { - my ($photo, $direction) = @_; - return $photo unless $IM; - my $image = Image::Magick->new; - $image->BlobToImage($photo); - my $err = $image->Rotate($direction); - return 0 if $err; - my @blobs = $image->ImageToBlob(); - undef $image; - return $blobs[0]; -} - - -# Shrinks a picture to the specified size, but keeping in proportion. -sub _shrink { - my ($photo, $size) = @_; - return $photo unless $IM; - my $image = Image::Magick->new; - $image->BlobToImage($photo); - my $err = $image->Scale(geometry => "$size>"); - throw Error::Simple("resize failed: $err") if "$err"; - $image->Strip(); - my @blobs = $image->ImageToBlob(); - undef $image; - return $blobs[0]; -} - -# Shrinks a picture to 90x60, cropping so that it is exactly that. -sub _crop { - my ($photo) = @_; - return $photo unless $IM; - my $image = Image::Magick->new; - $image->BlobToImage($photo); - my $err = $image->Resize( geometry => "90x60^" ); - throw Error::Simple("resize failed: $err") if "$err"; - $err = $image->Extent( geometry => '90x60', gravity => 'Center' ); - throw Error::Simple("resize failed: $err") if "$err"; - $image->Strip(); - my @blobs = $image->ImageToBlob(); - undef $image; - return $blobs[0]; -} - 1; 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; |