From a97b0e27d1fbbdcbc89e1c8f44c17e634a8a18cb Mon Sep 17 00:00:00 2001 From: Augusto Cesar Ferreira Date: Tue, 14 Dec 2021 12:45:05 -0300 Subject: [PATCH 1/4] Adds support for image resolution for GD --- docs/usage/introduction.rst | 6 +++--- src/Gd/Image.php | 13 +++++++++++++ src/Image/ImageInterface.php | 7 +++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/docs/usage/introduction.rst b/docs/usage/introduction.rst index 5bf33ef45..39c411794 100644 --- a/docs/usage/introduction.rst +++ b/docs/usage/introduction.rst @@ -29,7 +29,7 @@ Install the dependencies using composer.phar and use Imagine : .. code-block:: none php composer.phar install - + .. code-block:: php color('#000', 0); $image = $imagine->create($size, $color); - + To use a solid background color, for example orange, provide an alpha of 100. .. code-block:: php @@ -173,7 +173,7 @@ Three options groups are currently supported : quality, resolution and flatten. Default values are 75 for Jpeg quality, 7 for Png compression level, 75 for webp quality and 72 dpi for x/y-resolution. .. NOTE:: - GD does not support resolution options group + GD does support resolution options group only with PHP 7 >= 7.2, PHP 8 The following example demonstrates the basic quality settings. diff --git a/src/Gd/Image.php b/src/Gd/Image.php index ab5e4eadc..c2e0f6cfd 100644 --- a/src/Gd/Image.php +++ b/src/Gd/Image.php @@ -727,6 +727,19 @@ private function saveOrOutput(Format $format, array $options, $filename = null) break; } + if (isset($options['resolution-units']) && isset($options['resolution-x']) && function_exists('imageresolution')) { + + $resolution_x = $options['resolution-x']; + $resolution_y = isset($options['resolution-y']) ? $options['resolution-y'] : $resolution_x; + + if ($options['resolution-units'] === ImageInterface::RESOLUTION_PIXELSPERCENTIMETER) { + $resolution_x = $resolution_x * ImageInterface::RESOLUTION_PPC_TO_PPI_MULTIPLIER; + $resolution_y = $resolution_y * ImageInterface::RESOLUTION_PPC_TO_PPI_MULTIPLIER; + } + + imageresolution($this->resource, $resolution_x, $resolution_y); + } + ErrorHandling::throwingRuntimeException(E_WARNING | E_NOTICE, function () use ($saveFunction, $args) { if (call_user_func_array($saveFunction, $args) === false) { throw new RuntimeException('Save operation failed'); diff --git a/src/Image/ImageInterface.php b/src/Image/ImageInterface.php index 5d95fcaff..2015dd486 100644 --- a/src/Image/ImageInterface.php +++ b/src/Image/ImageInterface.php @@ -32,6 +32,13 @@ interface ImageInterface extends ManipulatorInterface */ const RESOLUTION_PIXELSPERCENTIMETER = 'ppc'; + /** + * Multiplier for converting resolution from ppc to ppi + * + * @var float + */ + const RESOLUTION_PPC_TO_PPI_MULTIPLIER = 2.54; + /** * Image interlacing: none. * From 06fae250a0e800563218453ee180b60521d2d64b Mon Sep 17 00:00:00 2001 From: Augusto Cesar Ferreira Date: Tue, 14 Dec 2021 12:53:24 -0300 Subject: [PATCH 2/4] Fix cs --- src/Gd/Image.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Gd/Image.php b/src/Gd/Image.php index c2e0f6cfd..9d2b3f646 100644 --- a/src/Gd/Image.php +++ b/src/Gd/Image.php @@ -188,7 +188,7 @@ final public function paste(ImageInterface $image, PointInterface $start, $alpha throw new RuntimeException('Image paste operation failed'); } } elseif ($alpha > 0) { - if (imagecopymerge(/*dst_im*/$this->resource, /*src_im*/$image->resource, /*dst_x*/$start->getX(), /*dst_y*/$start->getY(), /*src_x*/0, /*src_y*/0, /*src_w*/$size->getWidth(), /*src_h*/$size->getHeight(), /*pct*/$alpha) === false) { + if (imagecopymerge(/*dst_im*/$this->resource, /*src_im*/ $image->resource, /*dst_x*/ $start->getX(), /*dst_y*/ $start->getY(), /*src_x*/ 0, /*src_y*/ 0, /*src_w*/ $size->getWidth(), /*src_h*/ $size->getHeight(), /*pct*/ $alpha) === false) { throw new RuntimeException('Image paste operation failed'); } } @@ -728,7 +728,6 @@ private function saveOrOutput(Format $format, array $options, $filename = null) } if (isset($options['resolution-units']) && isset($options['resolution-x']) && function_exists('imageresolution')) { - $resolution_x = $options['resolution-x']; $resolution_y = isset($options['resolution-y']) ? $options['resolution-y'] : $resolution_x; From 31b418996a22f30cf7541fd628d83fd030c93cd3 Mon Sep 17 00:00:00 2001 From: Augusto Cesar Ferreira Date: Tue, 14 Dec 2021 13:37:55 -0300 Subject: [PATCH 3/4] CS Fix --- src/Image/ImageInterface.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Image/ImageInterface.php b/src/Image/ImageInterface.php index 2015dd486..045e53f0b 100644 --- a/src/Image/ImageInterface.php +++ b/src/Image/ImageInterface.php @@ -33,7 +33,7 @@ interface ImageInterface extends ManipulatorInterface const RESOLUTION_PIXELSPERCENTIMETER = 'ppc'; /** - * Multiplier for converting resolution from ppc to ppi + * Multiplier for converting resolution from ppc to ppi. * * @var float */ From 2a5c310f7c3168d5275b5f0b5de1372f5ed41c05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Augusto=20C=C3=A9sar=20Ferreira?= Date: Wed, 15 Dec 2021 08:00:27 -0300 Subject: [PATCH 4/4] Update src/Gd/Image.php MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Apply correct code style. Co-authored-by: Martin Auswöger --- src/Gd/Image.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Gd/Image.php b/src/Gd/Image.php index 9d2b3f646..c11e1c689 100644 --- a/src/Gd/Image.php +++ b/src/Gd/Image.php @@ -728,15 +728,15 @@ private function saveOrOutput(Format $format, array $options, $filename = null) } if (isset($options['resolution-units']) && isset($options['resolution-x']) && function_exists('imageresolution')) { - $resolution_x = $options['resolution-x']; - $resolution_y = isset($options['resolution-y']) ? $options['resolution-y'] : $resolution_x; + $resolutionX = $options['resolution-x']; + $resolutionY = isset($options['resolution-y']) ? $options['resolution-y'] : $resolutionX; if ($options['resolution-units'] === ImageInterface::RESOLUTION_PIXELSPERCENTIMETER) { - $resolution_x = $resolution_x * ImageInterface::RESOLUTION_PPC_TO_PPI_MULTIPLIER; - $resolution_y = $resolution_y * ImageInterface::RESOLUTION_PPC_TO_PPI_MULTIPLIER; + $resolutionX *= ImageInterface::RESOLUTION_PPC_TO_PPI_MULTIPLIER; + $resolutionY *= ImageInterface::RESOLUTION_PPC_TO_PPI_MULTIPLIER; } - imageresolution($this->resource, $resolution_x, $resolution_y); + imageresolution($this->resource, $resolutionX, $resolutionY); } ErrorHandling::throwingRuntimeException(E_WARNING | E_NOTICE, function () use ($saveFunction, $args) {