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/DriverInfo.php b/src/Gd/DriverInfo.php index 358818710..07ab86afc 100644 --- a/src/Gd/DriverInfo.php +++ b/src/Gd/DriverInfo.php @@ -94,9 +94,15 @@ protected function checkFeature($feature) case static::FEATURE_MULTIPLELAYERS: throw new NotSupportedException('GD does not support layer sets'); case static::FEATURE_CUSTOMRESOLUTION: - throw new NotSupportedException('GD does not support setting custom resolutions'); + if (!function_exists('imageresolution')) { + throw new NotSupportedException('GD driver for PHP older than 7.2 does not support setting custom resolutions'); + } + break; case static::FEATURE_EXPORTWITHCUSTOMRESOLUTION: - throw new NotSupportedException('GD driver does not support exporting images with custom resolutions'); + if (!function_exists('imageresolution')) { + throw new NotSupportedException('GD driver for PHP older than 7.2 does not support exporting images with custom resolutions'); + } + break; case static::FEATURE_DRAWFILLEDCHORDSCORRECTLY: throw new NotSupportedException('The GD Drawer can NOT draw correctly filled chords'); case static::FEATURE_DRAWUNFILLEDCIRCLESWITHTICHKESSCORRECTLY: diff --git a/src/Gd/Image.php b/src/Gd/Image.php index e418576e4..16f0e2732 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'); } } @@ -747,6 +747,21 @@ private function finalizeOptions(Format $format, array $options) break; } + if (isset($options['resolution-units']) && isset($options['resolution-x']) && function_exists('imageresolution')) { + $resolutionX = $options['resolution-x']; + $resolutionY = isset($options['resolution-y']) ? $options['resolution-y'] : $resolutionX; + switch ($options['resolution-units']) { + case ImageInterface::RESOLUTION_PIXELSPERCENTIMETER: + imageresolution($this->resource, $resolutionX * ImageInterface::RESOLUTION_PPC_TO_PPI_MULTIPLIER, $resolutionY * ImageInterface::RESOLUTION_PPC_TO_PPI_MULTIPLIER); + break; + case ImageInterface::RESOLUTION_PIXELSPERINCH: + imageresolution($this->resource, $resolutionX, $resolutionY); + break; + default: + throw new RuntimeException('Unsupported image unit format'); + } + } + return $result; } diff --git a/src/Image/ImageInterface.php b/src/Image/ImageInterface.php index 6b5abd529..6dfd299ed 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. * diff --git a/tests/tests/Gd/ImageTest.php b/tests/tests/Gd/ImageTest.php index 823a022d1..623834b66 100644 --- a/tests/tests/Gd/ImageTest.php +++ b/tests/tests/Gd/ImageTest.php @@ -48,6 +48,12 @@ protected function getImagine() */ protected function getImageResolution(ImageInterface $image) { + $resolutions = imageresolution($image->getGdResource()); + + return array( + 'x' => $resolutions[0], + 'y' => $resolutions[1], + ); } /** diff --git a/tests/tests/Image/AbstractImageTest.php b/tests/tests/Image/AbstractImageTest.php index a4613437e..d6a8de7be 100644 --- a/tests/tests/Image/AbstractImageTest.php +++ b/tests/tests/Image/AbstractImageTest.php @@ -952,10 +952,14 @@ public function testResolutionOnSave($source) public function provideVariousSources() { - return array( - array(IMAGINE_TEST_FIXTURESFOLDER . '/example.svg'), + $result = array( array(IMAGINE_TEST_FIXTURESFOLDER . '/100-percent-black.png'), ); + if ($this->getImagine() instanceof \Imagine\Imagick\Imagine) { + $result[] = array(IMAGINE_TEST_FIXTURESFOLDER . '/example.svg'); + } + + return $result; } public function testFillAlphaPrecision()