From 10c8b360ac8f63f94e88188f2f36a3513fb1e76a Mon Sep 17 00:00:00 2001 From: ADmad Date: Tue, 30 Jan 2024 12:54:17 +0530 Subject: [PATCH] Fix interlacing. Interlacing for JPGs only seems to be working when using Imagick. So need to look into that later or state that as a limitation in the docs. --- src/Manipulators/Encode.php | 45 +++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/src/Manipulators/Encode.php b/src/Manipulators/Encode.php index 9a81e7c..bfeb16b 100644 --- a/src/Manipulators/Encode.php +++ b/src/Manipulators/Encode.php @@ -5,6 +5,7 @@ use Intervention\Image\Drivers\Gd\Driver as GdDriver; use Intervention\Image\Drivers\Imagick\Driver as ImagickDriver; use Intervention\Image\ImageManager; +use Intervention\Image\Interfaces\DriverInterface; use Intervention\Image\Interfaces\ImageInterface; class Encode extends BaseManipulator @@ -21,30 +22,23 @@ public function run(ImageInterface $image): ImageInterface $format = $this->getFormat($image); $quality = $this->getQuality(); $driver = $image->driver(); + $interlace = false; - if (in_array($format, ['jpg', 'pjpg'], true)) { - $image = (new ImageManager($driver)) - ->create($image->width(), $image->height()) - ->fill('ffffff') - ->place($image, 'top-left', 0, 0); - } + if ('pjpg' === $format) { + $interlace = true; - if (in_array($format, ['png', 'pjpg'], true)) { - $i = $image->core()->native(); - if ($driver instanceof ImagickDriver) { - $i->setInterlaceScheme(3); // 3 = Imagick::INTERLACE_PLANE constant - } elseif ($driver instanceof GdDriver) { - imageinterlace($i, true); - } - - if ('pjpg' === $format) { - $format = 'jpg'; - } + $format = 'jpg'; } - return (new ImageManager($driver))->read( - $image->encodeByExtension($format, $quality)->toFilePointer() + $image = (new ImageManager($driver))->read( + $image->encodeByExtension($format, $quality)->toString() ); + + if ($interlace) { + $image = $this->interlace($image, $driver); + } + + return $image; } /** @@ -104,4 +98,17 @@ public function getQuality(): int return (int) $q; } + + protected function interlace(ImageInterface $image, DriverInterface $driver): ImageInterface + { + $img = $image->core()->native(); + + if ($driver instanceof ImagickDriver) { + $img->setInterlaceScheme(\Imagick::INTERLACE_PLANE); + } elseif ($driver instanceof GdDriver) { + imageinterlace($img, true); + } + + return $image; + } }