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; }