%PDF- %PDF-
| Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/file/libs/ |
| Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/file/libs/ImageHelper.php |
<?php
/**
* @link https://www.humhub.org/
* @copyright Copyright (c) 2021 HumHub GmbH & Co. KG
* @license https://www.humhub.com/licences
*/
namespace humhub\modules\file\libs;
use humhub\modules\file\models\File;
use humhub\modules\file\Module;
use Imagine\Image\ImageInterface;
use Yii;
use yii\base\Exception;
use yii\base\InvalidConfigException;
use yii\imagine\Image;
/**
* Class ImageHelper
*
* @since 1.5.2
* @package humhub\modules\file\libs
*/
class ImageHelper
{
/**
* Fix orientation of JPEG images based on EXIF information
*
* @see https://github.com/yiisoft/yii2-imagine/issues/44
* @param $image ImageInterface
* @param $file File|string
* @throws \yii\base\InvalidConfigException
*/
public static function fixJpegOrientation($image, $file)
{
$mimeType = '';
if ($file instanceof File) {
$mimeType = $file->mime_type;
$file = $file->store->get();
} elseif (is_string($file) && file_exists($file)) {
$mimeType = FileHelper::getMimeType($file);
}
if ($mimeType === 'image/jpeg' && function_exists('exif_read_data')) {
$exif = @exif_read_data($file);
if (!empty($exif['Orientation'])) {
switch ($exif['Orientation']) {
case 3:
$image->rotate(180);
break;
case 6:
$image->rotate(90);
break;
case 8:
$image->rotate(-90);
break;
}
if ($image instanceof \Imagine\Imagick\Image) {
/** @var \Imagine\Imagick\Image $image */
$image->getImagick()->setImageOrientation(1);
}
}
}
}
/**
* Scales down a file image if necessary.
* The limits can be defined in the File Module class.
*
* @param $file File
* @since 1.7
*/
public static function downscaleImage($file)
{
if (substr($file->mime_type, 0, 6) !== 'image/') {
return;
}
/** @var Module $module */
$module = Yii::$app->getModule('file');
// Is used to avoid saving without any configured scaling option.
$isModified = false;
$imagineOptions = [];
if ($file->mime_type === 'image/jpeg') {
if (!empty($module->imageJpegQuality)) {
$imagineOptions['jpeg_quality'] = $module->imageJpegQuality;
$isModified = true;
}
$imagineOptions['format'] = 'jpeg';
} elseif ($file->mime_type === 'image/png') {
if (!empty($module->imagePngCompressionLevel)) {
$imagineOptions['png_compression_level'] = $module->imagePngCompressionLevel;
$isModified = true;
}
$imagineOptions['format'] = 'png';
} elseif ($file->mime_type === 'image/webp') {
if (!empty($module->imageWebpQuality)) {
$imagineOptions['webp_quality'] = $module->imageWebpQuality;
$isModified = true;
}
$imagineOptions = ['format' => 'webp'];
} elseif ($file->mime_type === 'image/gif') {
$imagineOptions = ['format' => 'gif'];
} else {
return;
}
try {
$image = Image::getImagine()->open($file->store->get());
} catch (\Exception $ex) {
Yii::error('Could not open image ' . $file->store->get() . '. Error: ' . $ex->getMessage(), 'file');
return;
}
static::fixJpegOrientation($image, $file);
if ($module->imageMaxResolution !== null) {
$maxResolution = explode('x', $module->imageMaxResolution, 2);
if (empty($maxResolution)) {
throw new InvalidConfigException('Invalid max. image resolution configured!');
}
if ($image->getSize()->getWidth() > $maxResolution[0]) {
$image->resize($image->getSize()->widen($maxResolution[0]));
$isModified = true;
}
if ($image->getSize()->getHeight() > $maxResolution[1]) {
$image->resize($image->getSize()->heighten($maxResolution[1]));
$isModified = true;
}
}
if ($isModified) {
$image->save($file->store->get(), $imagineOptions);
$file->updateAttributes(['size' => filesize($file->store->get())]);
}
}
/**
* @param string $filePath
* @return bool
* @throws Exception
*/
public static function checkMaxDimensions(string $filePath): bool
{
/* @var $module Module */
$module = Yii::$app->getModule('file');
// Don't allow to process an image more X megapixels
if (!empty($module->imageMaxProcessingMP) &&
!empty($filePath) &&
is_file($filePath) &&
($imageSize = @getimagesize($filePath)) &&
isset($imageSize[0], $imageSize[1]) &&
$imageSize[0] * $imageSize[1] > $module->imageMaxProcessingMP * 1024 * 1024) {
throw new Exception('Image more ' . $module->imageMaxProcessingMP . ' megapixels cannot be processed!');
}
return true;
}
}