diff options
-rw-r--r-- | lib/AppInfo/Application.php | 1 | ||||
-rw-r--r-- | lib/Listener/SizeMetadataProvider.php | 16 |
2 files changed, 17 insertions, 0 deletions
diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index ecf30fcf..2af980eb 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -92,6 +92,7 @@ class Application extends App implements IBootstrap { // 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 ce01cbf8..4ce62981 100644 --- a/lib/Listener/SizeMetadataProvider.php +++ b/lib/Listener/SizeMetadataProvider.php @@ -67,6 +67,22 @@ class SizeMetadataProvider implements IEventListener { 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], |