Browse Source

Fix avatar on exif rotated images

Fixes #1928

Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
tags/v11.0RC2
Roeland Jago Douma 7 years ago
parent
commit
b05fe45d52
No account linked to committer's email address
2 changed files with 28 additions and 0 deletions
  1. 1
    0
      core/Controller/AvatarController.php
  2. 27
    0
      lib/private/legacy/image.php

+ 1
- 0
core/Controller/AvatarController.php View File

@@ -237,6 +237,7 @@ class AvatarController extends Controller {
try {
$image = new \OC_Image();
$image->loadFromData($content);
$image->readExif($content);
$image->fixOrientation();

if ($image->valid()) {

+ 27
- 0
lib/private/legacy/image.php View File

@@ -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.

Loading…
Cancel
Save