From 2f84ccc627f86e2772879edb554ff5a1d02412d3 Mon Sep 17 00:00:00 2001 From: provokateurin Date: Mon, 13 May 2024 10:57:01 +0200 Subject: [PATCH] fix(SizeMetadataProvider): Swap the width and height if the image is rotated Signed-off-by: provokateurin --- lib/AppInfo/Application.php | 1 + lib/Listener/SizeMetadataProvider.php | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index 36d4c8bc2..655b57581 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -92,6 +92,7 @@ public function register(IRegistrationContext $context): void { // Metadata $context->registerEventListener(MetadataLiveEvent::class, ExifMetadataProvider::class); $context->registerEventListener(MetadataBackgroundEvent::class, ExifMetadataProvider::class); + // SizeMetadataProvider optionally depends on ExifMetadataProvider, so it has to be registered afterwards $context->registerEventListener(MetadataLiveEvent::class, SizeMetadataProvider::class); $context->registerEventListener(MetadataBackgroundEvent::class, SizeMetadataProvider::class); $context->registerEventListener(MetadataLiveEvent::class, OriginalDateTimeMetadataProvider::class); diff --git a/lib/Listener/SizeMetadataProvider.php b/lib/Listener/SizeMetadataProvider.php index ce01cbf87..4ce629813 100644 --- a/lib/Listener/SizeMetadataProvider.php +++ b/lib/Listener/SizeMetadataProvider.php @@ -67,6 +67,22 @@ public function handle(Event $event): void { return; } + // The image might have a rotation stored in the EXIF data. + // If that is the case and the rotation is 90/270 degrees the width and height need to be swapped. + // This is necessary because the clients will take the rotation into account when displaying the image. + if ($event->getMetadata()->hasKey('photos-ifd0')) { + $ifd0 = $event->getMetadata()->getArray('photos-ifd0'); + if (array_key_exists('Orientation', $ifd0)) { + /** @var int $orientation */ + $orientation = $ifd0['Orientation']; + + // https://exiftool.org/TagNames/EXIF.html + if ($orientation >= 5) { + $size = [$size[1], $size[0]]; + } + } + } + $event->getMetadata()->setArray('photos-size', [ 'width' => $size[0], 'height' => $size[1],