From 793e67a6004089e2c0f642b466301fb9a1efbe81 Mon Sep 17 00:00:00 2001 From: Oliver Vogel Date: Tue, 9 Jan 2024 16:11:01 +0100 Subject: [PATCH 1/3] Implement HeicEncoder --- src/Drivers/Imagick/Encoders/HeicEncoder.php | 25 ++++++++++++++++++++ src/Encoders/FileExtensionEncoder.php | 1 + src/Encoders/HeicEncoder.php | 10 ++++++++ src/Encoders/MediaTypeEncoder.php | 1 + src/Image.php | 11 +++++++++ src/Interfaces/ImageInterface.php | 8 +++++++ 6 files changed, 56 insertions(+) create mode 100644 src/Drivers/Imagick/Encoders/HeicEncoder.php create mode 100644 src/Encoders/HeicEncoder.php diff --git a/src/Drivers/Imagick/Encoders/HeicEncoder.php b/src/Drivers/Imagick/Encoders/HeicEncoder.php new file mode 100644 index 00000000..1825cc19 --- /dev/null +++ b/src/Drivers/Imagick/Encoders/HeicEncoder.php @@ -0,0 +1,25 @@ +core()->native(); + + $imagick->setFormat($format); + $imagick->setImageFormat($format); + $imagick->setCompressionQuality($this->quality); + $imagick->setImageCompressionQuality($this->quality); + + return new EncodedImage($imagick->getImagesBlob(), 'image/heic'); + } +} diff --git a/src/Encoders/FileExtensionEncoder.php b/src/Encoders/FileExtensionEncoder.php index 5637792e..a6c6991b 100644 --- a/src/Encoders/FileExtensionEncoder.php +++ b/src/Encoders/FileExtensionEncoder.php @@ -56,6 +56,7 @@ class FileExtensionEncoder extends AutoEncoder 'png' => new PngEncoder(), 'tiff', 'tif' => new TiffEncoder($this->quality), 'jp2', 'j2k', 'jpf', 'jpm', 'jpg2', 'j2c', 'jpc', 'jpx' => new Jpeg2000Encoder($this->quality), + 'heic', 'heif' => new HeicEncoder($this->quality), default => throw new EncoderException('No encoder found for file extension (' . $extension . ').'), }; } diff --git a/src/Encoders/HeicEncoder.php b/src/Encoders/HeicEncoder.php new file mode 100644 index 00000000..3977b858 --- /dev/null +++ b/src/Encoders/HeicEncoder.php @@ -0,0 +1,10 @@ + new PngEncoder(), 'image/tiff' => new TiffEncoder($this->quality), 'image/jp2', 'image/jpx', 'image/jpm' => new Jpeg2000Encoder($this->quality), + 'image/heic', 'image/heif', => new HeicEncoder($this->quality), default => throw new EncoderException('No encoder found for media type (' . $type . ').'), }; } diff --git a/src/Image.php b/src/Image.php index 5dce3eef..1ed3f4e1 100644 --- a/src/Image.php +++ b/src/Image.php @@ -16,6 +16,7 @@ use Intervention\Image\Encoders\BmpEncoder; use Intervention\Image\Encoders\FileExtensionEncoder; use Intervention\Image\Encoders\FilePathEncoder; use Intervention\Image\Encoders\GifEncoder; +use Intervention\Image\Encoders\HeicEncoder; use Intervention\Image\Encoders\Jpeg2000Encoder; use Intervention\Image\Encoders\JpegEncoder; use Intervention\Image\Encoders\MediaTypeEncoder; @@ -927,6 +928,16 @@ final class Image implements ImageInterface return $this->toTiff($quality); } + /** + * {@inheritdoc} + * + * @see ImageInterface::toHeic() + */ + public function toHeic(int $quality = 75): EncodedImageInterface + { + return $this->encode(new HeicEncoder($quality)); + } + /** * Clone image * diff --git a/src/Interfaces/ImageInterface.php b/src/Interfaces/ImageInterface.php index c50144d1..a9ba6f2e 100644 --- a/src/Interfaces/ImageInterface.php +++ b/src/Interfaces/ImageInterface.php @@ -655,4 +655,12 @@ interface ImageInterface extends IteratorAggregate, Countable * @return EncodedImageInterface */ public function toTiff(int $quality = 75): EncodedImageInterface; + + /** + * Encode image to HEIC format + * + * @param int $quality + * @return EncodedImageInterface + */ + public function toHeic(int $quality = 75): EncodedImageInterface; } From e12dae469c585232d3e8e4502290b85aab68b757 Mon Sep 17 00:00:00 2001 From: Oliver Vogel Date: Tue, 9 Jan 2024 16:12:56 +0100 Subject: [PATCH 2/3] Add property tag --- src/Drivers/Imagick/Encoders/HeicEncoder.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Drivers/Imagick/Encoders/HeicEncoder.php b/src/Drivers/Imagick/Encoders/HeicEncoder.php index 1825cc19..5c5ef82d 100644 --- a/src/Drivers/Imagick/Encoders/HeicEncoder.php +++ b/src/Drivers/Imagick/Encoders/HeicEncoder.php @@ -7,6 +7,9 @@ use Intervention\Image\EncodedImage; use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Interfaces\EncodedImageInterface; +/** + * @property int $quality + */ class HeicEncoder extends DriverSpecializedEncoder { public function encode(ImageInterface $image): EncodedImageInterface From 2374eef54184018e818f7996359eaaf80ecc149b Mon Sep 17 00:00:00 2001 From: Oliver Vogel Date: Tue, 9 Jan 2024 16:14:30 +0100 Subject: [PATCH 3/3] Add heic encoder test --- .../Imagick/Encoders/HeicEncoderTest.php | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 tests/Drivers/Imagick/Encoders/HeicEncoderTest.php diff --git a/tests/Drivers/Imagick/Encoders/HeicEncoderTest.php b/tests/Drivers/Imagick/Encoders/HeicEncoderTest.php new file mode 100644 index 00000000..47d61a44 --- /dev/null +++ b/tests/Drivers/Imagick/Encoders/HeicEncoderTest.php @@ -0,0 +1,41 @@ +newImage(3, 2, new ImagickPixel('red'), 'jpg'); + + return new Image( + new Driver(), + new Core($imagick) + ); + } + + public function testEncode(): void + { + $image = $this->getTestImage(); + $encoder = new HeicEncoder(75); + $result = $encoder->encode($image); + $this->assertMediaType('image/heic', (string) $result); + } +}