Current File : /home/pacjaorg/public_html/kmm/administrator/components/com_sppagebuilder/helpers/media-helper.php |
<?php
/**
* @package SP Page Builder
* @author JoomShaper http://www.joomshaper.com
* @copyright Copyright (c) 2010 - 2023 JoomShaper
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or later
*/
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Filesystem\Path;
use Joomla\Filesystem\Exception\FilesystemException;
//no direct access
defined('_JEXEC') or die('Restricted access');
class BuilderMediaHelper
{
public static function isValidImagesPath(string $path): bool
{
$mediaParams = ComponentHelper::getParams('com_media');
$filePath = Path::clean($mediaParams->get('file_path', 'images'));
$fullFilePath = Path::clean(JPATH_ROOT . '/' . $filePath);
return strpos($path, $fullFilePath) === 0;
}
public static function checkForMediaActionBoundary(string $path)
{
try {
$cleanedPath = Path::check($path);
} catch (\Exception $e) {
throw new FilesystemException($e->getMessage());
}
// TODO: Need to check this later
// if (!self::isValidImagesPath($cleanedPath))
// {
// throw new FilesystemException('Invalid path for performing this action.');
// }
return $cleanedPath;
}
private static function getImageSource($image_path)
{
$image_properties = @getimagesize($image_path);
$image_type = $image_properties[2];
$imageSource = false;
switch ($image_type) {
case 1:
$imageSource = @imagecreatefromgif($image_path);
break;
case 2:
$imageSource = @imagecreatefromjpeg($image_path);
break;
case 3:
$imageSource = @imagecreatefrompng($image_path);
break;
case 18: // webp
$imageSource = @imagecreatefromwebp($image_path);
break;
}
return $imageSource;
}
public static function convertImage($image_path, $destination, $convert_type = 'webp')
{
$image = self::getImageSource($image_path);
if (!$image) {
return false;
}
// get dimensions of image
$width = imagesx($image);
$height = imagesy($image);
// create a canvas
$canvas = imagecreatetruecolor($width, $height);
imageAlphaBlending($canvas, false);
imageSaveAlpha($canvas, true);
// By default, the canvas is black, so make it transparent
$transparent = imagecolorallocatealpha($canvas, 0, 0, 0, 127);
imagefilledrectangle($canvas, 0, 0, $width - 1, $height - 1, $transparent);
// copy image to canvas
imagecopy($canvas, $image, 0, 0, 0, 0, $width, $height);
$is_image_saved = false;
switch ($convert_type) {
case 'png':
$is_image_saved = imagepng($canvas, $destination, 8);
break;
default:
// save canvas as a webp
$is_image_saved = imagewebp($canvas, $destination, 80); // 80 is the quality parameter (0-100)
break;
}
// clean up memory
imagedestroy($canvas);
return $is_image_saved;
}
public static function changeAspectRatio($aspect_ratio, $image_path, $destination, $output_image_format = 'webp')
{
$sourceImage = self::getImageSource($image_path);
if (!$sourceImage) {
return false;
}
// Calculate the new dimensions while maintaining the aspect ratio
$sourceWidth = imagesx($sourceImage);
$sourceHeight = imagesy($sourceImage);
$parts = explode(':', $aspect_ratio ?? '1:1');
$aspectRatio = $parts[0] / $parts[1];
// Calculate the target width and height based on the aspect ratio
if ($sourceWidth / $sourceHeight > $aspectRatio) {
$newWidth = round($sourceHeight * $aspectRatio);
$newHeight = $sourceHeight;
} else {
$newWidth = $sourceWidth;
$newHeight = round($sourceWidth / $aspectRatio);
}
if ($aspect_ratio === '1:1') {
$newHeight = min($newHeight, 1024);
$newWidth = min($newWidth, 1024);
}
// Create a new image with the desired dimensions
$newImage = @imagecreatetruecolor($newWidth, $newHeight);
if (!$newImage) {
return false;
}
$backgroundColor = @imagecolorallocatealpha($newImage, 0, 0, 0, 127);
// Fill the image with the background color
imagefill($newImage, 0, 0, $backgroundColor);
// Set the blending mode for transparent background
imagesavealpha($newImage, true);
// Resize the source image to fit the new dimensions
$isSuccess = @imagecopyresampled($newImage, $sourceImage, 0, 0, 0, 0, $newWidth, $newHeight, $sourceWidth, $sourceHeight);
if (!$isSuccess) {
return false;
}
switch ($output_image_format) {
case 'png':
$isSuccess = @imagepng($newImage, $destination, 8);
break;
default:
// save canvas as a webp
$isSuccess = @imagewebp($newImage, $destination, 80); // 80 is the quality parameter (0-100)
break;
}
// Clean up resources
imagedestroy($sourceImage);
imagedestroy($newImage);
return $isSuccess;
}
}