From 7209e21e5ab6081d779c4cc88597504916590cf3 Mon Sep 17 00:00:00 2001 From: Andy Heathershaw Date: Mon, 5 Sep 2016 09:58:37 +0100 Subject: [PATCH] EXIF orientation is now respected and the original rotation angle stored in the database --- app/Console/Commands/ProcessUploadCommand.php | 32 +++++++++++++++++-- app/Helpers/ImageHelper.php | 27 ++++++++++++++++ ...9_02_220323_add_photo_metadata_columns.php | 2 ++ 3 files changed, 59 insertions(+), 2 deletions(-) diff --git a/app/Console/Commands/ProcessUploadCommand.php b/app/Console/Commands/ProcessUploadCommand.php index 8db4c2a..6d3eed3 100644 --- a/app/Console/Commands/ProcessUploadCommand.php +++ b/app/Console/Commands/ProcessUploadCommand.php @@ -106,15 +106,43 @@ class ProcessUploadCommand extends Command // Read the Exif data $exifData = @exif_read_data($photoFile); + $angleToRotate = 0; - // For debugging: - //dump($exifData); + if (isset($exifData['Orientation'])) + { + switch ($exifData['Orientation']) + { + case 3: + $angleToRotate = 180; + break; + + case 6: + $angleToRotate = 270; + break; + + case 8: + $angleToRotate = 90; + break; + } + + if ($angleToRotate > 0) + { + $originalPhotoResource = $this->imageHelper->rotateImage($originalPhotoResource, $angleToRotate); + + if ($angleToRotate == 90 || $angleToRotate == 270) + { + $photo->width = $imageInfo[1]; + $photo->height = $imageInfo[0]; + } + } + } $photo->metadata_version = ProcessUploadCommand::METADATA_VERSION; $photo->taken_at = $this->metadataDateTime($exifData); $photo->camera_make = $this->metadataCameraMake($exifData); $photo->camera_model = $this->metadataCameraModel($exifData); $photo->camera_software = $this->metadataCameraSoftware($exifData); + $photo->rotation = $angleToRotate; $photo->save(); // Generate and save thumbnails diff --git a/app/Helpers/ImageHelper.php b/app/Helpers/ImageHelper.php index 67f58d7..5b30d28 100644 --- a/app/Helpers/ImageHelper.php +++ b/app/Helpers/ImageHelper.php @@ -85,4 +85,31 @@ class ImageHelper return $im; } + + public function rotateImage($imageResource, $angle) + { + imagesetinterpolation($imageResource, IMG_SINC); + + return imagerotate($imageResource, $angle, 0); + + /*switch ($angle) + { + case 90: + case 270: + // Need a new image canvas + $maxDimension = ($photo->width > $photo->height ? $photo->width : $photo->height); + $newImageResource = imagecreatetruecolor($maxDimension, $maxDimension); + imagecopy($newImageResource, $imageResource, 0, 0, 0, 0, $photo->width, $photo->height); + $newImageResource = imagerotate($newImageResource, $angle, 0); + $imageResource = $newImageResource; + break; + + case 180: + // We can just rotate this in-place + $imageResource = imagerotate($imageResource, $angle, 0); + break; + } + + return $imageResource;*/ + } } \ No newline at end of file diff --git a/database/migrations/2016_09_02_220323_add_photo_metadata_columns.php b/database/migrations/2016_09_02_220323_add_photo_metadata_columns.php index ecda951..e453f91 100644 --- a/database/migrations/2016_09_02_220323_add_photo_metadata_columns.php +++ b/database/migrations/2016_09_02_220323_add_photo_metadata_columns.php @@ -21,6 +21,7 @@ class AddPhotoMetadataColumns extends Migration $table->string('camera_software')->nullable(); $table->integer('width')->nullable(); $table->integer('height')->nullable(); + $table->integer('rotation')->nullable(); }); } @@ -39,6 +40,7 @@ class AddPhotoMetadataColumns extends Migration $table->dropColumn('camera_software'); $table->dropColumn('width'); $table->dropColumn('height'); + $table->dropColumn('rotation'); }); } }