Fix avatar on exif rotated images
Fixes #1928 Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
This commit is contained in:
parent
b98dfaccd9
commit
b05fe45d52
|
@ -237,6 +237,7 @@ class AvatarController extends Controller {
|
||||||
try {
|
try {
|
||||||
$image = new \OC_Image();
|
$image = new \OC_Image();
|
||||||
$image->loadFromData($content);
|
$image->loadFromData($content);
|
||||||
|
$image->readExif($content);
|
||||||
$image->fixOrientation();
|
$image->fixOrientation();
|
||||||
|
|
||||||
if ($image->valid()) {
|
if ($image->valid()) {
|
||||||
|
|
|
@ -54,6 +54,8 @@ class OC_Image implements \OCP\IImage {
|
||||||
private $fileInfo;
|
private $fileInfo;
|
||||||
/** @var \OCP\ILogger */
|
/** @var \OCP\ILogger */
|
||||||
private $logger;
|
private $logger;
|
||||||
|
/** @var array */
|
||||||
|
private $exif;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get mime type for an image file.
|
* 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.
|
* @return int The orientation or -1 if no EXIF data is available.
|
||||||
*/
|
*/
|
||||||
public function getOrientation() {
|
public function getOrientation() {
|
||||||
|
if ($this->exif !== null) {
|
||||||
|
return $this->exif['Orientation'];
|
||||||
|
}
|
||||||
|
|
||||||
if ($this->imageType !== IMAGETYPE_JPEG) {
|
if ($this->imageType !== IMAGETYPE_JPEG) {
|
||||||
$this->logger->debug('OC_Image->fixOrientation() Image is not a JPEG.', array('app' => 'core'));
|
$this->logger->debug('OC_Image->fixOrientation() Image is not a JPEG.', array('app' => 'core'));
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -370,9 +376,30 @@ class OC_Image implements \OCP\IImage {
|
||||||
if (!isset($exif['Orientation'])) {
|
if (!isset($exif['Orientation'])) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
$this->exif = $exif;
|
||||||
return $exif['Orientation'];
|
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 ;)
|
* (I'm open for suggestions on better method name ;)
|
||||||
* Fixes orientation based on EXIF data.
|
* Fixes orientation based on EXIF data.
|
||||||
|
|
Loading…
Reference in New Issue