From 04faec22a656652c123f93c75ef04b9a5def5978 Mon Sep 17 00:00:00 2001 From: Oliver Vogel Date: Sun, 17 Dec 2023 17:08:10 +0100 Subject: [PATCH] Add Image::toMediaType() --- src/Encoders/AutoEncoder.php | 40 +++++++++++++++++++++-------- src/Encoders/MediaTypeEncoder.php | 33 ++++++++++++++++++++++++ src/Image.php | 11 ++++++++ src/Interfaces/ImageInterface.php | 9 +++++++ tests/Drivers/Gd/ImageTest.php | 11 ++++++++ tests/Drivers/Imagick/ImageTest.php | 11 ++++++++ 6 files changed, 104 insertions(+), 11 deletions(-) create mode 100644 src/Encoders/MediaTypeEncoder.php diff --git a/src/Encoders/AutoEncoder.php b/src/Encoders/AutoEncoder.php index 4a8850db..f57ef302 100644 --- a/src/Encoders/AutoEncoder.php +++ b/src/Encoders/AutoEncoder.php @@ -9,20 +9,38 @@ use Intervention\Image\Interfaces\ImageInterface; class AutoEncoder implements EncoderInterface { + /** + * {@inheritdoc} + * + * @see EncoderInterface::encode() + */ public function encode(ImageInterface $image): EncodedImageInterface { - $type = $image->origin()->mediaType(); return $image->encode( - match ($type) { - 'image/webp' => new WebpEncoder(), - 'image/avif' => new AvifEncoder(), - 'image/jpeg' => new JpegEncoder(), - 'image/bmp' => new BmpEncoder(), - 'image/gif' => new GifEncoder(), - 'image/png' => new PngEncoder(), - 'image/tiff' => new TiffEncoder(), - default => throw new EncoderException('No encoder found for media type (' . $type . ').'), - } + $this->encoderByMediaType( + $image->origin()->mediaType() + ) ); } + + /** + * Return encoder matching to encode given media (mime) type + * + * @param string $type + * @return EncoderInterface + * @throws EncoderException + */ + protected function encoderByMediaType(string $type): EncoderInterface + { + return match ($type) { + 'image/webp' => new WebpEncoder(), + 'image/avif' => new AvifEncoder(), + 'image/jpeg' => new JpegEncoder(), + 'image/bmp' => new BmpEncoder(), + 'image/gif' => new GifEncoder(), + 'image/png' => new PngEncoder(), + 'image/tiff' => new TiffEncoder(), + default => throw new EncoderException('No encoder found for media type (' . $type . ').'), + }; + } } diff --git a/src/Encoders/MediaTypeEncoder.php b/src/Encoders/MediaTypeEncoder.php new file mode 100644 index 00000000..6cd779d2 --- /dev/null +++ b/src/Encoders/MediaTypeEncoder.php @@ -0,0 +1,33 @@ +encode( + $this->encoderByMediaType( + is_null($this->type) ? $image->origin()->mediaType() : $this->type + ) + ); + } +} diff --git a/src/Image.php b/src/Image.php index 5e713433..f2aded3e 100644 --- a/src/Image.php +++ b/src/Image.php @@ -16,6 +16,7 @@ use Intervention\Image\Encoders\AvifEncoder; use Intervention\Image\Encoders\BmpEncoder; use Intervention\Image\Encoders\GifEncoder; use Intervention\Image\Encoders\JpegEncoder; +use Intervention\Image\Encoders\MediaTypeEncoder; use Intervention\Image\Encoders\PngEncoder; use Intervention\Image\Encoders\TiffEncoder; use Intervention\Image\Encoders\WebpEncoder; @@ -744,6 +745,16 @@ final class Image implements ImageInterface, Countable ); } + /** + * {@inheritdoc} + * + * @see ImageInterface::toMediaType() + */ + public function toMediaType(?string $type = null): EncodedImageInterface + { + return $this->encode(new MediaTypeEncoder($type)); + } + /** * {@inheritdoc} * diff --git a/src/Interfaces/ImageInterface.php b/src/Interfaces/ImageInterface.php index 32c6e7aa..a12b22b5 100644 --- a/src/Interfaces/ImageInterface.php +++ b/src/Interfaces/ImageInterface.php @@ -557,6 +557,15 @@ interface ImageInterface extends IteratorAggregate, Countable */ public function drawLine(callable $init): ImageInterface; + /** + * Encode image to given media (mime) type. If no type is given the image + * will be encoded to the format of the originally read image. + * + * @param null|string $type + * @return EncodedImageInterface + */ + public function toMediaType(?string $type = null): EncodedImageInterface; + /** * Encode image to JPEG format * diff --git a/tests/Drivers/Gd/ImageTest.php b/tests/Drivers/Gd/ImageTest.php index d911a7ad..9c9523c3 100644 --- a/tests/Drivers/Gd/ImageTest.php +++ b/tests/Drivers/Gd/ImageTest.php @@ -122,6 +122,17 @@ class ImageTest extends TestCase $this->assertMediaType('image/gif', (string) $result); } + public function testToMediaType(): void + { + $result = $this->readTestImage('blue.gif')->toMediaType(); + $this->assertInstanceOf(EncodedImage::class, $result); + $this->assertMediaType('image/gif', (string) $result); + + $result = $this->readTestImage('blue.gif')->toMediaType('image/png'); + $this->assertInstanceOf(EncodedImage::class, $result); + $this->assertMediaType('image/png', (string) $result); + } + public function testWidthHeightSize(): void { $this->assertEquals(3, $this->image->width()); diff --git a/tests/Drivers/Imagick/ImageTest.php b/tests/Drivers/Imagick/ImageTest.php index 1845f085..23d9b617 100644 --- a/tests/Drivers/Imagick/ImageTest.php +++ b/tests/Drivers/Imagick/ImageTest.php @@ -121,6 +121,17 @@ class ImageTest extends TestCase $this->assertMediaType('image/gif', (string) $result); } + public function testToMediaType(): void + { + $result = $this->readTestImage('blue.gif')->toMediaType(); + $this->assertInstanceOf(EncodedImage::class, $result); + $this->assertMediaType('image/gif', (string) $result); + + $result = $this->readTestImage('blue.gif')->toMediaType('image/png'); + $this->assertInstanceOf(EncodedImage::class, $result); + $this->assertMediaType('image/png', (string) $result); + } + public function testWidthHeightSize(): void { $this->assertEquals(20, $this->image->width());