function fix_orientation($source, $name) { $imginfo = getimagesize($source); $requiredMemory1 = ceil($imginfo[0] * $imginfo[1] * 5.35); $requiredMemory2 = ceil($imginfo[0] * $imginfo[1] * ($imginfo['bits'] / 8) * $imginfo['channels'] * 2.5); $requiredMemory = (int) max($requiredMemory1, $requiredMemory2); $mem_avail = elgg_get_ini_setting_in_bytes('memory_limit'); $mem_used = memory_get_usage(); $mem_avail = $mem_avail - $mem_used - 2097152; // 2 MB buffer if ($requiredMemory > $mem_avail) { // we don't have enough memory for any manipulation // @TODO - we should only throw an error if the image needs rotating... //register_error(elgg_echo('image_orientation:toolarge')); return false; } elgg_load_library('imagine'); $name = uniqid() . $name; $tmp_location = elgg_get_config('dataroot') . 'image_orientation/' . $name; //@note - need to copy to a tmp_location as // imagine doesn't like images with no file extension copy($source, $tmp_location); try { $imagine = new Imagine(); $imagine->setMetadataReader(new ExifMetadataReader()); $autorotate = new Autorotate(); $autorotate->apply($imagine->open($tmp_location))->save($tmp_location); copy($tmp_location, $source); unlink($tmp_location); return true; } catch (Imagine\Exception\Exception $exc) { // fail silently, we don't need to rotate it bad enough to kill the script return false; } }
/** * Create Service Factory * * @param ServiceLocatorInterface $serviceLocator * * @throws \DomainException * @return AbstractImagine */ public function createService(ServiceLocatorInterface $serviceLocator) { if (class_exists('Gmagick')) { $service = new Imagine\Gmagick\Imagine(); } elseif (class_exists('Imagick')) { $service = new Imagine\Imagick\Imagine(); } elseif (function_exists('gd_info')) { $service = new Imagine\Gd\Imagine(); } else { throw new \DomainException('No image library available for Imagine. Gmagick, Imagick, or GD required'); } /* * Grab as much info as possible */ $service->setMetadataReader(new ChainedMetadataReader([new ExifMetadataReader(), new GpsMetadataReader(), new IptcMetadataReader()])); return $service; }
/** * @return \Imagine\Image\AbstractImagine * @throws \yii\base\NotSupportedException */ private function createImagine() { $driver = null; while (!$driver && (list($index, $driverName) = each($this->drivers))) { if ($driverName === 'gmagick' && class_exists('Gmagick', false)) { $driver = new ImagineGmagick(); } elseif ($driverName === 'imagick' && class_exists('Imagick', false)) { $driver = new ImagineImagick(); } elseif ($driverName === 'gd' && function_exists('gd_info')) { $driver = new ImagineGd(); } } if (!$driver) { throw new NotSupportedException(); } /* @var $driver AbstractImagine */ if (function_exists('exif_read_data')) { $driver->setMetadataReader(new ExifMetadataReader()); } return $driver; }