package Imager::ExifOrientation; use strict; use warnings; our $VERSION = '0.07'; use Carp; use Imager; use Image::ExifTool 'ImageInfo'; use Image::ExifTool::Exif; my $orientation_revers = {}; while (my($k, $v) = each %Image::ExifTool::Exif::orientation) { $orientation_revers->{$v} = $k; } sub rotate { my($class, %opts) = @_; my $img = Imager->new; my $exif; if ($opts{data}) { $exif = ImageInfo(\$opts{data}); $img->read( data => $opts{data}, type => 'jpeg' ); } elsif ($opts{path}) { $exif = ImageInfo($opts{path}); $img->read( file => $opts{path}, type => 'jpeg' ); } else { croak "usage: Imager::ExifOrientation->rotate( path => '/foo/bar/baz.jpg' ) Imager::ExifOrientation->rotate( data => \$jpeg_data ) "; } my $orientation = $class->get_orientation_by_exiftool($exif || {}); $class->_rotate($img, $orientation); } sub get_orientation_by_exiftool { my($class, $exif) = @_; return 1 unless $exif->{Orientation}; return $orientation_revers->{$exif->{Orientation}} || 1; } my $rotate_maps = { 1 => { right => 0, mirror => undef }, # Horizontal (normal) 2 => { right => 0, mirror => 'h' }, # Mirror horizontal 3 => { right => 0, mirror => 'hv' }, # Rotate 180 (rotate is too noisy) 4 => { right => 0, mirror => 'v' }, # Mirror vertical 5 => { right => 270, mirror => 'h' }, # Mirror horizontal and rotate 270 CW 6 => { right => 90, mirror => undef }, # Rotate 90 CW 7 => { right => 90, mirror => 'h' }, # Mirror horizontal and rotate 90 CW 8 => { right => 270, mirror => undef }, # Rotate 270 CW }; sub _rotate { my($class, $img, $orientation) = @_; my $map = $rotate_maps->{$orientation}; if ($map->{mirror}) { $img->flip( dir => $map->{mirror} ); } if ($map->{right}) { return $img->rotate( right => $map->{right} ); } $img; } 1; __END__ =head1 NAME Imager::ExifOrientation - A picture is rotated using Orientation of Exif =head1 SYNOPSIS use Imager::ExifOrientation; # rotate by original image my $image = Imager::ExifOrientation->rotate( file => 'foo.jpg' ); # rotate by original image data my $data = do { open my $fh, '<', 'foo.jpg'; local $/; <$fh>; }; my $image = Imager::ExifOrientation->rotate( data => $data ); =head1 DESCRIPTION Imager::ExifOrientation is a picture is rotated based on the information on Exif. rotate method rotates based on an original jpeg picture. It is rotated to L object by using Filter. =head1 AUTHOR Kazuhiro Osawa Eyappo shibuya plE =head1 SEE ALSO L, L, L =head1 LICENSE This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut