diff --git a/src/Drivers/Abstract/AbstractImage.php b/src/Drivers/Abstract/AbstractImage.php index c643c5e5..3d682bf7 100644 --- a/src/Drivers/Abstract/AbstractImage.php +++ b/src/Drivers/Abstract/AbstractImage.php @@ -55,14 +55,14 @@ abstract class AbstractImage return $this->loops; } - public function size(): SizeInterface + public function getSize(): SizeInterface { return new Size($this->width(), $this->height()); } public function getResizer(): Resizer { - return new Resizer($this->size()); + return new Resizer($this->getSize()); } public function isAnimated(): bool @@ -77,17 +77,17 @@ abstract class AbstractImage public function encode(EncoderInterface $encoder): EncodedImage { - return new EncodedImage($encoder->encode($this)); + return $encoder->encode($this); } - public function toJpeg(?int $quality = null): string + public function toJpeg(?int $quality = null): EncodedImage { return $this->encode( $this->resolveDriverClass('Encoders\JpegEncoder', $quality) ); } - public function toGif(): string + public function toGif(): EncodedImage { return $this->encode( $this->resolveDriverClass('Encoders\GifEncoder') diff --git a/src/Drivers/Gd/Encoders/GifEncoder.php b/src/Drivers/Gd/Encoders/GifEncoder.php index 47dbb7cb..99d37001 100644 --- a/src/Drivers/Gd/Encoders/GifEncoder.php +++ b/src/Drivers/Gd/Encoders/GifEncoder.php @@ -2,25 +2,28 @@ namespace Intervention\Image\Drivers\Gd\Encoders; +use Intervention\Gif\Builder as GifBuilder; use Intervention\Image\Drivers\Abstract\Encoders\AbstractEncoder; +use Intervention\Image\EncodedImage; use Intervention\Image\Interfaces\EncoderInterface; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Gif\Builder as GifBuilder; class GifEncoder extends AbstractEncoder implements EncoderInterface { - public function encode(ImageInterface $image): string + public function encode(ImageInterface $image): EncodedImage { if ($image->isAnimated()) { return $this->encodeAnimated($image); } - return $this->getBuffered(function () use ($image) { + $data = $this->getBuffered(function () use ($image) { imagegif($image->getFrames()->first()->getCore()); }); + + return new EncodedImage($data, 'image/gif'); } - protected function encodeAnimated($image): string + protected function encodeAnimated($image): EncodedImage { $builder = GifBuilder::canvas($image->width(), $image->height(), $image->loops()); foreach ($image as $key => $frame) { @@ -28,6 +31,6 @@ class GifEncoder extends AbstractEncoder implements EncoderInterface $builder->addFrame($source, $frame->getDelay()); } - return $builder->encode(); + return new EncodedImage($builder->encode(), 'image/gif'); } } diff --git a/src/Drivers/Gd/Encoders/JpegEncoder.php b/src/Drivers/Gd/Encoders/JpegEncoder.php index 408c7b95..02a3e969 100644 --- a/src/Drivers/Gd/Encoders/JpegEncoder.php +++ b/src/Drivers/Gd/Encoders/JpegEncoder.php @@ -3,15 +3,18 @@ namespace Intervention\Image\Drivers\Gd\Encoders; use Intervention\Image\Drivers\Abstract\Encoders\AbstractEncoder; +use Intervention\Image\EncodedImage; use Intervention\Image\Interfaces\EncoderInterface; use Intervention\Image\Interfaces\ImageInterface; class JpegEncoder extends AbstractEncoder implements EncoderInterface { - public function encode(ImageInterface $image): string + public function encode(ImageInterface $image): EncodedImage { - return $this->getBuffered(function () use ($image) { + $data = $this->getBuffered(function () use ($image) { imagejpeg($image->getFrames()->first()->getCore(), null, $this->quality); }); + + return new EncodedImage($data, 'image/jpeg'); } } diff --git a/src/Drivers/Imagick/Encoders/GifEncoder.php b/src/Drivers/Imagick/Encoders/GifEncoder.php index fa846238..f795f174 100644 --- a/src/Drivers/Imagick/Encoders/GifEncoder.php +++ b/src/Drivers/Imagick/Encoders/GifEncoder.php @@ -4,12 +4,13 @@ namespace Intervention\Image\Drivers\Imagick\Encoders; use Imagick; use Intervention\Image\Drivers\Abstract\Encoders\AbstractEncoder; +use Intervention\Image\EncodedImage; use Intervention\Image\Interfaces\EncoderInterface; use Intervention\Image\Interfaces\ImageInterface; class GifEncoder extends AbstractEncoder implements EncoderInterface { - public function encode(ImageInterface $image): string + public function encode(ImageInterface $image): EncodedImage { $format = 'gif'; $compression = Imagick::COMPRESSION_LZW; @@ -26,6 +27,6 @@ class GifEncoder extends AbstractEncoder implements EncoderInterface $gif->setImageCompression($compression); $gif = $gif->deconstructImages(); - return $gif->getImagesBlob(); + return new EncodedImage($gif->getImagesBlob(), 'image/gif'); } } diff --git a/src/Drivers/Imagick/Encoders/JpegEncoder.php b/src/Drivers/Imagick/Encoders/JpegEncoder.php index 179531d7..45fd7220 100644 --- a/src/Drivers/Imagick/Encoders/JpegEncoder.php +++ b/src/Drivers/Imagick/Encoders/JpegEncoder.php @@ -4,12 +4,13 @@ namespace Intervention\Image\Drivers\Imagick\Encoders; use Imagick; use Intervention\Image\Drivers\Abstract\Encoders\AbstractEncoder; +use Intervention\Image\EncodedImage; use Intervention\Image\Interfaces\EncoderInterface; use Intervention\Image\Interfaces\ImageInterface; class JpegEncoder extends AbstractEncoder implements EncoderInterface { - public function encode(ImageInterface $image): string + public function encode(ImageInterface $image): EncodedImage { $format = 'jpeg'; $compression = Imagick::COMPRESSION_JPEG; @@ -24,6 +25,6 @@ class JpegEncoder extends AbstractEncoder implements EncoderInterface $imagick->setCompressionQuality($this->quality); $imagick->setImageCompressionQuality($this->quality); - return $imagick->getImagesBlob(); + return new EncodedImage($imagick->getImagesBlob(), 'image/jpeg'); } } diff --git a/src/EncodedImage.php b/src/EncodedImage.php index fa01f656..7f8d0848 100644 --- a/src/EncodedImage.php +++ b/src/EncodedImage.php @@ -9,9 +9,10 @@ class EncodedImage protected $data; protected $mimetype; - public function __construct(string $data) + public function __construct(string $data, string $mimetype = 'application/octet-stream') { $this->data = $data; + $this->mimetype = $mimetype; } public function save(string $filepath): void @@ -26,7 +27,7 @@ class EncodedImage public function toDataUrl(): string { - return ''; + return sprintf('data:%s;base64,%s', $this->mimetype, base64_encode($this->data)); } public function __toString(): string diff --git a/src/Interfaces/EncoderInterface.php b/src/Interfaces/EncoderInterface.php index 03163d22..c2d9c41c 100644 --- a/src/Interfaces/EncoderInterface.php +++ b/src/Interfaces/EncoderInterface.php @@ -2,7 +2,9 @@ namespace Intervention\Image\Interfaces; +use Intervention\Image\EncodedImage; + interface EncoderInterface { - public function encode(ImageInterface $image): string; + public function encode(ImageInterface $image): EncodedImage; } diff --git a/src/Interfaces/ImageInterface.php b/src/Interfaces/ImageInterface.php index a7609d05..33231f2c 100644 --- a/src/Interfaces/ImageInterface.php +++ b/src/Interfaces/ImageInterface.php @@ -6,7 +6,7 @@ use Intervention\Image\EncodedImage; interface ImageInterface { - public function size(): SizeInterface; + public function getSize(): SizeInterface; public function width(): int; public function height(): int; public function isAnimated(): bool; diff --git a/tests/Drivers/Gd/ImageTest.php b/tests/Drivers/Gd/ImageTest.php index b2275680..0f966290 100644 --- a/tests/Drivers/Gd/ImageTest.php +++ b/tests/Drivers/Gd/ImageTest.php @@ -39,15 +39,8 @@ class ImageTest extends TestCase $this->assertEquals(2, $this->image->height()); } - public function testSize(): void + public function testGetSize(): void { - $this->assertInstanceOf(Size::class, $this->image->size()); - } - - public function testResize(): void - { - $this->assertInstanceOf(Image::class, $this->image->resize(function ($size) { - $size->width(300); - })); + $this->assertInstanceOf(Size::class, $this->image->getSize()); } } diff --git a/tests/Drivers/Imagick/ImageTest.php b/tests/Drivers/Imagick/ImageTest.php index 611825d0..a70666dc 100644 --- a/tests/Drivers/Imagick/ImageTest.php +++ b/tests/Drivers/Imagick/ImageTest.php @@ -44,8 +44,8 @@ class ImageTest extends TestCase $this->assertEquals(2, $this->image->height()); } - public function testSize(): void + public function testGetSize(): void { - $this->assertInstanceOf(Size::class, $this->image->size()); + $this->assertInstanceOf(Size::class, $this->image->getSize()); } }