From 9fb8364727db74ac354b7e6169fb8dcdc232e219 Mon Sep 17 00:00:00 2001 From: freshleafmedia <10062339+freshleafmedia@users.noreply.github.com> Date: Thu, 12 Nov 2020 08:51:24 +0000 Subject: [PATCH 1/2] Adds support for the AVIF format --- src/Intervention/Image/AbstractEncoder.php | 12 ++++++++++++ src/Intervention/Image/Gd/Encoder.php | 12 ++++++++++++ src/Intervention/Image/Imagick/Encoder.php | 22 ++++++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/src/Intervention/Image/AbstractEncoder.php b/src/Intervention/Image/AbstractEncoder.php index d3e59eaa..f88c55e7 100644 --- a/src/Intervention/Image/AbstractEncoder.php +++ b/src/Intervention/Image/AbstractEncoder.php @@ -84,6 +84,13 @@ abstract class AbstractEncoder */ abstract protected function processWebp(); + /** + * Processes and returns image as Avif encoded string + * + * @return string + */ + abstract protected function processAvif(); + /** * Process a given image * @@ -168,6 +175,11 @@ abstract class AbstractEncoder case 'image/x-webp': $this->result = $this->processWebp(); break; + + case 'avif': + case 'image/avif': + $this->result = $this->processAvif(); + break; default: throw new NotSupportedException( diff --git a/src/Intervention/Image/Gd/Encoder.php b/src/Intervention/Image/Gd/Encoder.php index d8cc0217..f289a646 100644 --- a/src/Intervention/Image/Gd/Encoder.php +++ b/src/Intervention/Image/Gd/Encoder.php @@ -121,4 +121,16 @@ class Encoder extends \Intervention\Image\AbstractEncoder "PSD format is not supported by Gd Driver." ); } + + /** + * Processes and returns encoded image as AVIF string + * + * @return string + */ + protected function processAvif() + { + throw new NotSupportedException( + "AVIF format is not supported by Gd Driver." + ); + } } diff --git a/src/Intervention/Image/Imagick/Encoder.php b/src/Intervention/Image/Imagick/Encoder.php index ac7345e4..956e5fdd 100644 --- a/src/Intervention/Image/Imagick/Encoder.php +++ b/src/Intervention/Image/Imagick/Encoder.php @@ -170,4 +170,26 @@ class Encoder extends AbstractEncoder return $imagick->getImagesBlob(); } + + protected function processAvif() + { + if ( ! \Imagick::queryFormats('AVIF')) { + throw new NotSupportedException( + "AVIF format is not supported by Imagick installation." + ); + } + + $format = 'avif'; + $compression = \Imagick::COMPRESSION_UNDEFINED; + + $imagick = $this->image->getCore(); + $imagick->setFormat($format); + $imagick->setImageFormat($format); + $imagick->setCompression($compression); + $imagick->setImageCompression($compression); + $imagick->setCompressionQuality($this->quality); + $imagick->setImageCompressionQuality($this->quality); + + return $imagick->getImagesBlob(); + } } From 9c1188b4d8e554256b97729170f7a753a2b7af88 Mon Sep 17 00:00:00 2001 From: freshleafmedia <10062339+freshleafmedia@users.noreply.github.com> Date: Thu, 12 Nov 2020 17:28:51 +0000 Subject: [PATCH 2/2] Adds tests --- tests/EncoderTest.php | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests/EncoderTest.php b/tests/EncoderTest.php index 834618c3..3a18e14a 100644 --- a/tests/EncoderTest.php +++ b/tests/EncoderTest.php @@ -61,6 +61,18 @@ class EncoderTest extends TestCase } } + /** + * @expectedException \Intervention\Image\Exception\NotSupportedException + */ + public function testProcessAvifGd() + { + $core = imagecreatefromjpeg(__DIR__.'/images/test.jpg'); + $encoder = new GdEncoder; + $image = Mockery::mock('\Intervention\Image\Image'); + $img = $encoder->process($image, 'avif', 90); + $this->assertInstanceOf('Intervention\Image\Image', $img); + } + /** * @expectedException \Intervention\Image\Exception\NotSupportedException */ @@ -180,6 +192,16 @@ class EncoderTest extends TestCase $img = $encoder->process($image, 'webp', 90); } + /** + * @expectedException \Intervention\Image\Exception\NotSupportedException + */ + public function testProcessAvifImagick() + { + $encoder = new ImagickEncoder; + $image = Mockery::mock('\Intervention\Image\Image'); + $img = $encoder->process($image, 'avif', 90); + } + public function testProcessTiffImagick() { $core = $this->getImagickMock('tiff');