From 8ba4b91f56e831c620ef8d7fd55aaf354bd5323e Mon Sep 17 00:00:00 2001 From: Gwendolen Lynch Date: Wed, 22 Dec 2021 12:13:21 +0100 Subject: [PATCH] Webp encoders for GD & ImageMagick --- src/Drivers/Gd/Encoders/WebpEncoder.php | 25 ++++++++++++ src/Drivers/Imagick/Encoders/WebpEncoder.php | 36 ++++++++++++++++++ tests/Drivers/Gd/Encoders/WebpEncoderTest.php | 34 +++++++++++++++++ .../Imagick/Encoders/WebpEncoderTest.php | 38 +++++++++++++++++++ 4 files changed, 133 insertions(+) create mode 100644 src/Drivers/Gd/Encoders/WebpEncoder.php create mode 100644 src/Drivers/Imagick/Encoders/WebpEncoder.php create mode 100644 tests/Drivers/Gd/Encoders/WebpEncoderTest.php create mode 100644 tests/Drivers/Imagick/Encoders/WebpEncoderTest.php diff --git a/src/Drivers/Gd/Encoders/WebpEncoder.php b/src/Drivers/Gd/Encoders/WebpEncoder.php new file mode 100644 index 00000000..748db2a2 --- /dev/null +++ b/src/Drivers/Gd/Encoders/WebpEncoder.php @@ -0,0 +1,25 @@ +quality = $quality; + } + + public function encode(ImageInterface $image): EncodedImage + { + $data = $this->getBuffered(function () use ($image) { + imagewebp($image->getFrames()->first()->getCore(), null, $this->quality); + }); + + return new EncodedImage($data, 'image/webp'); + } +} diff --git a/src/Drivers/Imagick/Encoders/WebpEncoder.php b/src/Drivers/Imagick/Encoders/WebpEncoder.php new file mode 100644 index 00000000..0f7cb9f9 --- /dev/null +++ b/src/Drivers/Imagick/Encoders/WebpEncoder.php @@ -0,0 +1,36 @@ +quality = $quality; + } + + public function encode(ImageInterface $image): EncodedImage + { + $format = 'webp'; + $compression = Imagick::COMPRESSION_ZIP; + + $imagick = $image->getFrames()->first()->getCore(); + $imagick->setImageBackgroundColor(new ImagickPixel('transparent')); + + $imagick = $imagick->mergeImageLayers(Imagick::LAYERMETHOD_MERGE); + $imagick->setFormat($format); + $imagick->setImageFormat($format); + $imagick->setCompression($compression); + $imagick->setImageCompression($compression); + $imagick->setImageCompressionQuality($this->quality); + + return new EncodedImage($imagick->getImagesBlob(), 'image/webp'); + } +} diff --git a/tests/Drivers/Gd/Encoders/WebpEncoderTest.php b/tests/Drivers/Gd/Encoders/WebpEncoderTest.php new file mode 100644 index 00000000..994395bd --- /dev/null +++ b/tests/Drivers/Gd/Encoders/WebpEncoderTest.php @@ -0,0 +1,34 @@ +getTestImage(); + $encoder = new WebpEncoder(75); + $result = $encoder->encode($image); + $this->assertTrue(MimeSniffer::createFromString((string) $result)->matches(new ImageWebp())); + } +} diff --git a/tests/Drivers/Imagick/Encoders/WebpEncoderTest.php b/tests/Drivers/Imagick/Encoders/WebpEncoderTest.php new file mode 100644 index 00000000..dcced39b --- /dev/null +++ b/tests/Drivers/Imagick/Encoders/WebpEncoderTest.php @@ -0,0 +1,38 @@ +newImage(3, 2, new ImagickPixel('red'), 'png'); + $frame = new Frame($imagick); + + return new Image(new Collection([$frame])); + } + + public function testEncode(): void + { + $image = $this->getTestImage(); + $encoder = new WebpEncoder(75); + $result = $encoder->encode($image); + $this->assertTrue(MimeSniffer::createFromString((string) $result)->matches(new ImageWebp())); + } +}