vendor/pimcore/pimcore/lib/Image/Adapter.php line 277

Open in your IDE?
  1. <?php
  2. /**
  3.  * Pimcore
  4.  *
  5.  * This source file is available under two different licenses:
  6.  * - GNU General Public License version 3 (GPLv3)
  7.  * - Pimcore Commercial License (PCL)
  8.  * Full copyright and license information is available in
  9.  * LICENSE.md which is distributed with this source code.
  10.  *
  11.  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  12.  *  @license    http://www.pimcore.org/license     GPLv3 and PCL
  13.  */
  14. namespace Pimcore\Image;
  15. use Pimcore\Logger;
  16. abstract class Adapter
  17. {
  18.     /**
  19.      * @var int
  20.      */
  21.     protected $width;
  22.     /**
  23.      * @var int
  24.      */
  25.     protected $height;
  26.     /**
  27.      * @var bool
  28.      */
  29.     protected $reinitializing false;
  30.     /**
  31.      * @var array
  32.      */
  33.     protected $tmpFiles = [];
  34.     /**
  35.      * @var bool
  36.      */
  37.     protected $modified false;
  38.     /**
  39.      * @var bool
  40.      */
  41.     protected $isAlphaPossible false;
  42.     /**
  43.      * @var bool
  44.      */
  45.     protected $preserveColor false;
  46.     /**
  47.      * @var bool
  48.      */
  49.     protected $preserveAnimation false;
  50.     /**
  51.      * @var bool
  52.      */
  53.     protected $preserveMetaData false;
  54.     /**
  55.      * @var string
  56.      */
  57.     protected $sourceImageFormat;
  58.     /**
  59.      * @var mixed
  60.      */
  61.     protected $resource;
  62.     /**
  63.      * @param int $height
  64.      *
  65.      * @return $this
  66.      */
  67.     public function setHeight($height)
  68.     {
  69.         $this->height $height;
  70.         return $this;
  71.     }
  72.     /**
  73.      * @return int
  74.      */
  75.     public function getHeight()
  76.     {
  77.         return $this->height;
  78.     }
  79.     /**
  80.      * @param int $width
  81.      *
  82.      * @return $this
  83.      */
  84.     public function setWidth($width)
  85.     {
  86.         $this->width $width;
  87.         return $this;
  88.     }
  89.     /**
  90.      * @return int
  91.      */
  92.     public function getWidth()
  93.     {
  94.         return $this->width;
  95.     }
  96.     /**
  97.      * @todo: duplication found? (pimcore/lib/Pimcore/Document/Adapter.php::removeTmpFiles)
  98.      */
  99.     protected function removeTmpFiles()
  100.     {
  101.         // remove tmp files
  102.         if (!empty($this->tmpFiles)) {
  103.             foreach ($this->tmpFiles as $tmpFile) {
  104.                 if (file_exists($tmpFile)) {
  105.                     unlink($tmpFile);
  106.                 }
  107.             }
  108.         }
  109.     }
  110.     /**
  111.      * @param string $colorhex
  112.      *
  113.      * @return array
  114.      */
  115.     public function colorhex2colorarray($colorhex)
  116.     {
  117.         $r hexdec(substr($colorhex12));
  118.         $g hexdec(substr($colorhex32));
  119.         $b hexdec(substr($colorhex52));
  120.         return [$r$g$b'type' => 'RGB'];
  121.     }
  122.     /**
  123.      * @param int $width
  124.      * @param int $height
  125.      *
  126.      * @return $this
  127.      */
  128.     public function resize($width$height)
  129.     {
  130.         return $this;
  131.     }
  132.     /**
  133.      * @param int $width
  134.      * @param bool $forceResize
  135.      *
  136.      * @return $this
  137.      */
  138.     public function scaleByWidth($width$forceResize false)
  139.     {
  140.         if ($forceResize || $width <= $this->getWidth() || $this->isVectorGraphic()) {
  141.             $height floor(($width $this->getWidth()) * $this->getHeight());
  142.             $this->resize(max(1$width), max(1$height));
  143.         }
  144.         return $this;
  145.     }
  146.     /**
  147.      * @param int $height
  148.      * @param bool $forceResize
  149.      *
  150.      * @return $this
  151.      */
  152.     public function scaleByHeight($height$forceResize false)
  153.     {
  154.         if ($forceResize || $height $this->getHeight() || $this->isVectorGraphic()) {
  155.             $width floor(($height $this->getHeight()) * $this->getWidth());
  156.             $this->resize(max(1$width), max(1$height));
  157.         }
  158.         return $this;
  159.     }
  160.     /**
  161.      * @param int $width
  162.      * @param int $height
  163.      * @param bool $forceResize
  164.      *
  165.      * @return $this
  166.      */
  167.     public function contain($width$height$forceResize false)
  168.     {
  169.         $x $this->getWidth() / $width;
  170.         $y $this->getHeight() / $height;
  171.         if ((!$forceResize) && $x <= && $y <= && !$this->isVectorGraphic()) {
  172.             return $this;
  173.         } elseif ($x $y) {
  174.             $this->scaleByWidth($width$forceResize);
  175.         } else {
  176.             $this->scaleByHeight($height$forceResize);
  177.         }
  178.         return $this;
  179.     }
  180.     /**
  181.      * @param int $width
  182.      * @param int $height
  183.      * @param string|array $orientation
  184.      * @param bool $forceResize
  185.      *
  186.      * @return $this
  187.      */
  188.     public function cover($width$height$orientation 'center'$forceResize false)
  189.     {
  190.         if (empty($orientation)) {
  191.             $orientation 'center'// if not set (from GUI for instance) - default value in getByLegacyConfig method of Config object too
  192.         }
  193.         $ratio $this->getWidth() / $this->getHeight();
  194.         if (($width $height) > $ratio) {
  195.             $this->scaleByWidth($width$forceResize);
  196.         } else {
  197.             $this->scaleByHeight($height$forceResize);
  198.         }
  199.         if ($orientation === 'center') {
  200.             $cropX = ($this->getWidth() - $width) / 2;
  201.             $cropY = ($this->getHeight() - $height) / 2;
  202.         } elseif ($orientation === 'topleft') {
  203.             $cropX 0;
  204.             $cropY 0;
  205.         } elseif ($orientation === 'topright') {
  206.             $cropX $this->getWidth() - $width;
  207.             $cropY 0;
  208.         } elseif ($orientation === 'bottomleft') {
  209.             $cropX 0;
  210.             $cropY $this->getHeight() - $height;
  211.         } elseif ($orientation === 'bottomright') {
  212.             $cropX $this->getWidth() - $width;
  213.             $cropY $this->getHeight() - $height;
  214.         } elseif ($orientation === 'centerleft') {
  215.             $cropX 0;
  216.             $cropY = ($this->getHeight() - $height) / 2;
  217.         } elseif ($orientation === 'centerright') {
  218.             $cropX $this->getWidth() - $width;
  219.             $cropY = ($this->getHeight() - $height) / 2;
  220.         } elseif ($orientation === 'topcenter') {
  221.             $cropX = ($this->getWidth() - $width) / 2;
  222.             $cropY 0;
  223.         } elseif ($orientation === 'bottomcenter') {
  224.             $cropX = ($this->getWidth() - $width) / 2;
  225.             $cropY $this->getHeight() - $height;
  226.         } elseif (is_array($orientation) && isset($orientation['x'])) {
  227.             // focal point given in percentage values
  228.             $focalPointXCoordinate $orientation['x'] / 100 $this->getWidth();
  229.             $focalPointYCoordinate $orientation['y'] / 100 $this->getHeight();
  230.             $cropY $focalPointYCoordinate - ($height 2);
  231.             $cropY min($cropY$this->getHeight() - $height);
  232.             $cropY max($cropY0);
  233.             $cropX $focalPointXCoordinate - ($width 2);
  234.             $cropX min($cropX$this->getWidth() - $width);
  235.             $cropX max($cropX0);
  236.         } else {
  237.             $cropX null;
  238.             $cropY null;
  239.         }
  240.         if ($cropX !== null && $cropY !== null) {
  241.             $this->crop($cropX$cropY$width$height);
  242.         } else {
  243.             Logger::error('Cropping not processed, because X or Y is not defined or null, proceeding with next step');
  244.         }
  245.         return $this;
  246.     }
  247.     /**
  248.      * @param int $width
  249.      * @param int $height
  250.      * @param bool $forceResize
  251.      *
  252.      * @return $this
  253.      */
  254.     public function frame($width$height$forceResize false)
  255.     {
  256.         return $this;
  257.     }
  258.     /**
  259.      * @param int $tolerance
  260.      *
  261.      * @return $this
  262.      */
  263.     public function trim($tolerance)
  264.     {
  265.         return $this;
  266.     }
  267.     /**
  268.      * @param int $angle
  269.      *
  270.      * @return $this
  271.      */
  272.     public function rotate($angle)
  273.     {
  274.         return $this;
  275.     }
  276.     /**
  277.      * @param int $x
  278.      * @param int $y
  279.      * @param int $width
  280.      * @param int $height
  281.      *
  282.      * @return $this
  283.      */
  284.     public function crop($x$y$width$height)
  285.     {
  286.         return $this;
  287.     }
  288.     /**
  289.      * @param string $color
  290.      *
  291.      * @return $this
  292.      */
  293.     public function setBackgroundColor($color)
  294.     {
  295.         return $this;
  296.     }
  297.     /**
  298.      * @param string $image
  299.      *
  300.      * @return $this
  301.      */
  302.     public function setBackgroundImage($image)
  303.     {
  304.         return $this;
  305.     }
  306.     /**
  307.      * @param int $width
  308.      * @param int $height
  309.      *
  310.      * @return $this
  311.      */
  312.     public function roundCorners($width$height)
  313.     {
  314.         return $this;
  315.     }
  316.     /**
  317.      * @param mixed $image
  318.      * @param int $x
  319.      * @param int $y
  320.      * @param int $alpha
  321.      * @param string $composite
  322.      * @param string $origin Origin of the X and Y coordinates (top-left, top-right, bottom-left, bottom-right or center)
  323.      *
  324.      * @return $this
  325.      */
  326.     public function addOverlay($image$x 0$y 0$alpha 100$composite 'COMPOSITE_DEFAULT'$origin 'top-left')
  327.     {
  328.         return $this;
  329.     }
  330.     /**
  331.      * @param string $image
  332.      * @param string $composite
  333.      *
  334.      * @return $this
  335.      */
  336.     public function addOverlayFit($image$composite 'COMPOSITE_DEFAULT')
  337.     {
  338.         return $this;
  339.     }
  340.     /**
  341.      * @param string $image
  342.      *
  343.      * @return $this
  344.      */
  345.     public function applyMask($image)
  346.     {
  347.         return $this;
  348.     }
  349.     /**
  350.      * @param int $width
  351.      * @param int $height
  352.      * @param int $x
  353.      * @param int $y
  354.      *
  355.      * @return $this
  356.      */
  357.     public function cropPercent($width$height$x$y)
  358.     {
  359.         if ($this->isVectorGraphic()) {
  360.             // rasterize before cropping
  361.             $dimensions $this->getVectorRasterDimensions();
  362.             $this->resize($dimensions['width'], $dimensions['height']);
  363.         }
  364.         $originalWidth $this->getWidth();
  365.         $originalHeight $this->getHeight();
  366.         $widthPixel = (int) ceil($originalWidth * ($width 100));
  367.         $heightPixel = (int) ceil($originalHeight * ($height 100));
  368.         $xPixel = (int) ceil($originalWidth * ($x 100));
  369.         $yPixel = (int) ceil($originalHeight * ($y 100));
  370.         return $this->crop($xPixel$yPixel$widthPixel$heightPixel);
  371.     }
  372.     /**
  373.      * @return $this
  374.      */
  375.     public function grayscale()
  376.     {
  377.         return $this;
  378.     }
  379.     /**
  380.      * @return $this
  381.      */
  382.     public function sepia()
  383.     {
  384.         return $this;
  385.     }
  386.     /**
  387.      * @return $this
  388.      */
  389.     public function sharpen()
  390.     {
  391.         return $this;
  392.     }
  393.     /**
  394.      * @param string $mode
  395.      *
  396.      * @return $this
  397.      */
  398.     public function mirror($mode)
  399.     {
  400.         return $this;
  401.     }
  402.     /**
  403.      * @param int $radius
  404.      * @param float $sigma
  405.      *
  406.      * @return $this
  407.      */
  408.     public function gaussianBlur($radius 0$sigma 1.0)
  409.     {
  410.         return $this;
  411.     }
  412.     /**
  413.      * @param int $brightness
  414.      * @param int $saturation
  415.      * @param int $hue
  416.      *
  417.      * @return $this
  418.      */
  419.     public function brightnessSaturation($brightness 100$saturation 100$hue 100)
  420.     {
  421.         return $this;
  422.     }
  423.     /**
  424.      * @abstract
  425.      *
  426.      * @param string $imagePath
  427.      * @param array $options
  428.      *
  429.      * @return $this|false
  430.      */
  431.     abstract public function load($imagePath$options = []);
  432.     /**
  433.      * @param string $path
  434.      * @param string|null $format
  435.      * @param int|null $quality
  436.      *
  437.      * @return $this
  438.      */
  439.     abstract public function save($path$format null$quality null);
  440.     /**
  441.      * @abstract
  442.      */
  443.     abstract protected function destroy();
  444.     /**
  445.      * @return string
  446.      */
  447.     abstract public function getContentOptimizedFormat();
  448.     /**
  449.      * @internal
  450.      *
  451.      * @param string $format
  452.      * @param bool $force
  453.      *
  454.      * @return mixed
  455.      */
  456.     abstract public function supportsFormat(string $formatbool $force false);
  457.     public function preModify()
  458.     {
  459.         if ($this->getModified()) {
  460.             $this->reinitializeImage();
  461.         }
  462.     }
  463.     public function postModify()
  464.     {
  465.         $this->setModified(true);
  466.     }
  467.     protected function reinitializeImage()
  468.     {
  469.         $tmpFile PIMCORE_SYSTEM_TEMP_DIRECTORY '/' uniqid() . '_pimcore_image_tmp_file.png';
  470.         $this->tmpFiles[] = $tmpFile;
  471.         $format 'png32';
  472.         if ($this->isPreserveColor() || $this->isPreserveMetaData() || $this->isPreserveAnimation()) {
  473.             $format 'original';
  474.         }
  475.         $this->reinitializing true;
  476.         $this->save($tmpFile$format);
  477.         $this->destroy();
  478.         $this->load($tmpFile);
  479.         $this->reinitializing false;
  480.         $this->modified false;
  481.     }
  482.     public function __destruct()
  483.     {
  484.         $this->destroy();
  485.         $this->removeTmpFiles();
  486.     }
  487.     /**
  488.      * @return bool
  489.      */
  490.     public function isVectorGraphic()
  491.     {
  492.         return false;
  493.     }
  494.     /**
  495.      * @return array
  496.      */
  497.     protected function getVectorRasterDimensions()
  498.     {
  499.         $targetWidth 5000;
  500.         $factor $targetWidth $this->getWidth();
  501.         return [
  502.             'width' => $this->getWidth() * $factor,
  503.             'height' => $this->getHeight() * $factor,
  504.         ];
  505.     }
  506.     /**
  507.      * @param string $type
  508.      *
  509.      * @return $this
  510.      */
  511.     public function setColorspace($type 'RGB')
  512.     {
  513.         return $this;
  514.     }
  515.     /**
  516.      * @param bool $modified
  517.      */
  518.     public function setModified($modified)
  519.     {
  520.         $this->modified $modified;
  521.     }
  522.     /**
  523.      * @return bool
  524.      */
  525.     public function getModified()
  526.     {
  527.         return $this->modified;
  528.     }
  529.     /**
  530.      * @param bool $value
  531.      */
  532.     public function setIsAlphaPossible($value)
  533.     {
  534.         $this->isAlphaPossible $value;
  535.     }
  536.     /**
  537.      * @return bool
  538.      */
  539.     public function isPreserveColor()
  540.     {
  541.         return $this->preserveColor;
  542.     }
  543.     /**
  544.      * @param bool $preserveColor
  545.      */
  546.     public function setPreserveColor($preserveColor)
  547.     {
  548.         $this->preserveColor $preserveColor;
  549.     }
  550.     /**
  551.      * @return bool
  552.      */
  553.     public function isPreserveMetaData()
  554.     {
  555.         return $this->preserveMetaData;
  556.     }
  557.     /**
  558.      * @param bool $preserveMetaData
  559.      */
  560.     public function setPreserveMetaData($preserveMetaData)
  561.     {
  562.         $this->preserveMetaData $preserveMetaData;
  563.     }
  564.     /**
  565.      * @return bool
  566.      */
  567.     public function isPreserveAnimation()
  568.     {
  569.         return $this->preserveAnimation;
  570.     }
  571.     /**
  572.      * @param bool $preserveAnimation
  573.      */
  574.     public function setPreserveAnimation(bool $preserveAnimation): void
  575.     {
  576.         $this->preserveAnimation $preserveAnimation;
  577.     }
  578.     /**
  579.      * @return mixed
  580.      */
  581.     public function getResource()
  582.     {
  583.         return $this->resource;
  584.     }
  585. }