Current File : /var/www/vinorea/modules/tvcmscustomsetting/classes/tvcmsresizemasterclass.php
<?php
/**
 * 2007-2025 PrestaShop.
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License (AFL 3.0)
 * that is bundled with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@prestashop.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
 * versions in the future. If you wish to customize PrestaShop for your
 * needs please refer to http://www.prestashop.com for more information.
 *
 *  @author    PrestaShop SA <contact@prestashop.com>
 *  @copyright 2007-2025 PrestaShop SA
 *  @license   http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
 *  International Registered Trademark & Property of PrestaShop SA
 */
class TvcmsResizeMasterClass
{
    // *** Class variables
    private $image;

    private $width;

    private $height;

    private $imgResized;

    public function __construct($fileName)
    {
        // *** Open up the file
        $this->image = $this->openImage($fileName);

        // *** Get width and height
        $this->width = imagesx($this->image);
        $this->height = imagesy($this->image);
    }

    // # --------------------------------------------------------

    private function openImage($file)
    {
        // *** Get extension
        $extension = Tools::strtolower(strrchr($file, '.'));

        switch ($extension) {
            case '.jpg':
            case '.jpeg':
                $img = @imagecreatefromjpeg($file);

                break;
            case '.gif':
                $img = @imagecreatefromgif($file);

                break;
            case '.png':
                $img = @imagecreatefrompng($file);

                break;
            default:
                $img = false;

                break;
        }

        return $img;
    }

    // # --------------------------------------------------------

    public function resizeImage($newWd, $newHt, $type = 0)
    {
        $option = '';
        switch ($type) {
            case 1:
                $option = 'exact';

                break;
            case 2:
                $option = 'portrait';

                break;
            case 3:
                $option = 'landscape';

                break;
            case 4:
                $option = 'auto';

                break;
            case 5:
                $option = 'crop';

                break;
            default:
                $option = 'exact';

                break;
        }

        // *** Get optimal width and height - based on $option
        $optionArray = $this->getDimensions($newWd, $newHt, $option);
        $oplWd = $optionArray['oplWd'];
        $optHt = $optionArray['optHt'];
        // *** Resample - create image canvas of x, y size
        $this->imgResized = imagecreatetruecolor($oplWd, $optHt);
        // Make the background transparent
        imagealphablending($this->imgResized, false);
        imagesavealpha($this->imgResized, true);
        imagecopyresampled($this->imgResized, $this->image, 0, 0, 0, 0, $oplWd, $optHt, $this->width, $this->height);
        // *** if option is 'crop', then crop too
        if ('crop' == $option) {
            $this->crop($oplWd, $optHt, $newWd, $newHt);
        }
    }

    // # --------------------------------------------------------

    private function getDimensions($newWd, $newHt, $option)
    {
        switch ($option) {
            case 'exact':
                $oplWd = $newWd;
                $optHt = $newHt;

                break;
            case 'portrait':
                $oplWd = $this->getSizeByFixedHeight($newHt);
                $optHt = $newHt;

                break;
            case 'landscape':
                $oplWd = $newWd;
                $optHt = $this->getSizeByFixedWidth($newWd);

                break;
            case 'auto':
                $optionArray = $this->getSizeByAuto($newWd, $newHt);
                $oplWd = $optionArray['oplWd'];
                $optHt = $optionArray['optHt'];

                break;
            case 'crop':
                $optionArray = $this->getOptimalCrop($newWd, $newHt);
                $oplWd = $optionArray['oplWd'];
                $optHt = $optionArray['optHt'];

                break;
        }

        return ['oplWd' => $oplWd, 'optHt' => $optHt];
    }

    // # --------------------------------------------------------

    private function getSizeByFixedHeight($newHt)
    {
        $ratio = $this->width / $this->height;
        $newWd = $newHt * $ratio;

        return $newWd;
    }

    private function getSizeByFixedWidth($newWd)
    {
        $ratio = $this->height / $this->width;
        $newHt = $newWd * $ratio;

        return $newHt;
    }

    private function getSizeByAuto($newWd, $newHt)
    {
        if ($this->height < $this->width) {
            // *** Image to be resized is wider (landscape)
            $oplWd = $newWd;
            $optHt = $this->getSizeByFixedWidth($newWd);
        } elseif ($this->height > $this->width) {
            // *** Image to be resized is taller (portrait)
            $oplWd = $this->getSizeByFixedHeight($newHt);
            $optHt = $newHt;
        } else {
            // *** Image to be resizerd is a square
            if ($newHt < $newWd) {
                $oplWd = $newWd;
                $optHt = $this->getSizeByFixedWidth($newWd);
            } elseif ($newHt > $newWd) {
                $oplWd = $this->getSizeByFixedHeight($newHt);
                $optHt = $newHt;
            } else {
                // *** Sqaure being resized to a square
                $oplWd = $newWd;
                $optHt = $newHt;
            }
        }

        return ['oplWd' => $oplWd, 'optHt' => $optHt];
    }

    private function getOptimalCrop($newWd, $newHt)
    {
        $heightRatio = $this->height / $newHt;
        $widthRatio = $this->width / $newWd;

        if ($heightRatio < $widthRatio) {
            $optimalRatio = $heightRatio;
        } else {
            $optimalRatio = $widthRatio;
        }

        $optHt = $this->height / $optimalRatio;
        $oplWd = $this->width / $optimalRatio;

        return ['oplWd' => $oplWd, 'optHt' => $optHt];
    }

    // # --------------------------------------------------------

    private function crop($oplWd, $optHt, $newWd, $newHt)
    {
        // *** Find center - this will be used for the crop
        $cropStX = ($oplWd / 2) - ($newWd / 2);
        $cropStY = ($optHt / 2) - ($newHt / 2);

        $crop = $this->imgResized;
        // imagedestroy($this->imgResized);

        // *** Now crop from center to exact requested size
        $this->imgResized = imagecreatetruecolor($newWd, $newHt);
        imagecopyresampled($this->imgResized, $crop, 0, 0, $cropStX, $cropStY, $newWd, $newHt, $newWd, $newHt);
    }

    // # --------------------------------------------------------

    public function saveImage($savePath, $showImage = false, $imageQuality = '100')
    {
        // *** Get extension
        $ext = explode('.', $savePath);
        $extension = end($ext);
        $extension = Tools::strtolower('.' . $extension);

        if (!$showImage) {
            switch ($extension) {
                case '.jpg':
                case '.jpeg':
                    if (imagetypes() & IMG_JPG) {
                        @imagejpeg($this->imgResized, $savePath, $imageQuality);
                    }

                    break;

                case '.gif':
                    if (imagetypes() & IMG_GIF) {
                        @imagegif($this->imgResized, $savePath);
                    }

                    break;

                case '.png':
                    // *** Scale quality from 0-100 to 0-9
                    $scaleQuality = round(($imageQuality / 100) * 9);

                    // *** Invert quality setting as 0 is best, not 9
                    $invertScaleQuality = 9 - $scaleQuality;

                    if (imagetypes() & IMG_PNG) {
                        @imagepng($this->imgResized, $savePath, $invertScaleQuality);
                    }

                    break;

                    // ... etc

                default:
                    // *** No extension - No save.
                    break;
            }
        } else {// for show image
            switch ($extension) {
                case '.jpg':
                case '.jpeg':
                    Tools::redirect('Content-Type: image/jpg');
                    @imagejpeg($this->imgResized);

                    break;

                case '.gif':
                    Tools::redirect('Content-Type: image/gif');
                    @imagegif($this->imgResized);

                    break;

                case '.png':
                    Tools::redirect('Content-Type: image/png');
                    @imagepng($this->imgResized);

                    break;
            }
        }

        imagedestroy($this->imgResized);
    }
}