diff --git a/core/Controller/AvatarController.php b/core/Controller/AvatarController.php index c6f320dd0f..5e3d563cf2 100644 --- a/core/Controller/AvatarController.php +++ b/core/Controller/AvatarController.php @@ -237,6 +237,7 @@ class AvatarController extends Controller { try { $image = new \OC_Image(); $image->loadFromData($content); + $image->readExif($content); $image->fixOrientation(); if ($image->valid()) { diff --git a/lib/private/legacy/image.php b/lib/private/legacy/image.php index fee1a805c4..5403cccd02 100644 --- a/lib/private/legacy/image.php +++ b/lib/private/legacy/image.php @@ -54,6 +54,8 @@ class OC_Image implements \OCP\IImage { private $fileInfo; /** @var \OCP\ILogger */ private $logger; + /** @var array */ + private $exif; /** * Get mime type for an image file. @@ -347,6 +349,10 @@ class OC_Image implements \OCP\IImage { * @return int The orientation or -1 if no EXIF data is available. */ public function getOrientation() { + if ($this->exif !== null) { + return $this->exif['Orientation']; + } + if ($this->imageType !== IMAGETYPE_JPEG) { $this->logger->debug('OC_Image->fixOrientation() Image is not a JPEG.', array('app' => 'core')); return -1; @@ -370,9 +376,30 @@ class OC_Image implements \OCP\IImage { if (!isset($exif['Orientation'])) { return -1; } + $this->exif = $exif; return $exif['Orientation']; } + public function readExif($data) { + if (!is_callable('exif_read_data')) { + $this->logger->debug('OC_Image->fixOrientation() Exif module not enabled.', array('app' => 'core')); + return; + } + if (!$this->valid()) { + $this->logger->debug('OC_Image->fixOrientation() No image loaded.', array('app' => 'core')); + return; + } + + $exif = @exif_read_data('data://image/jpeg;base64,' . base64_encode($data)); + if (!$exif) { + return; + } + if (!isset($exif['Orientation'])) { + return; + } + $this->exif = $exif; + } + /** * (I'm open for suggestions on better method name ;) * Fixes orientation based on EXIF data.