diff --git a/src/Drivers/Abstract/AbstractImage.php b/src/Drivers/Abstract/AbstractImage.php index 84ae28ab..9467c67d 100644 --- a/src/Drivers/Abstract/AbstractImage.php +++ b/src/Drivers/Abstract/AbstractImage.php @@ -17,6 +17,8 @@ abstract class AbstractImage { use CanResolveDriverClass; + protected $loops = 0; + public function getIterator(): Collection { return $this->frames; @@ -34,6 +36,18 @@ abstract class AbstractImage return $this; } + public function setLoops(int $count): ImageInterface + { + $this->loops = $count; + + return $this; + } + + public function loops(): int + { + return $this->loops; + } + public function size(): SizeInterface { return new Size($this->width(), $this->height()); diff --git a/src/Drivers/Gd/Decoders/BinaryImageDecoder.php b/src/Drivers/Gd/Decoders/BinaryImageDecoder.php index 0269da2d..fcc2c992 100644 --- a/src/Drivers/Gd/Decoders/BinaryImageDecoder.php +++ b/src/Drivers/Gd/Decoders/BinaryImageDecoder.php @@ -40,6 +40,8 @@ class BinaryImageDecoder extends AbstractDecoder implements DecoderInterface $image = new Image(new Collection()); $gif = GifDecoder::decode($input); + $image->setLoops($gif->getMainApplicationExtension()?->getLoops()); + if (!$gif->isAnimated()) { return $image->addFrame(new Frame(@imagecreatefromstring($input))); } diff --git a/src/Drivers/Gd/Image.php b/src/Drivers/Gd/Image.php index 40742d24..5f331569 100644 --- a/src/Drivers/Gd/Image.php +++ b/src/Drivers/Gd/Image.php @@ -14,6 +14,8 @@ use IteratorAggregate; class Image extends AbstractImage implements ImageInterface, IteratorAggregate { + protected $loops = 0; + public function __construct(protected Collection $frames) { // diff --git a/src/Drivers/Imagick/Decoders/BinaryImageDecoder.php b/src/Drivers/Imagick/Decoders/BinaryImageDecoder.php index 96cc9a98..72cdc718 100644 --- a/src/Drivers/Imagick/Decoders/BinaryImageDecoder.php +++ b/src/Drivers/Imagick/Decoders/BinaryImageDecoder.php @@ -24,6 +24,7 @@ class BinaryImageDecoder extends AbstractDecoder implements DecoderInterface $imagick = $imagick->coalesceImages(); $image = new Image(new Collection()); + $image->setLoops($imagick->getNumberImages()); foreach ($imagick as $frame_content) { $image->addFrame(new Frame($frame_content)); diff --git a/src/Interfaces/ImageInterface.php b/src/Interfaces/ImageInterface.php index 735f046f..a7609d05 100644 --- a/src/Interfaces/ImageInterface.php +++ b/src/Interfaces/ImageInterface.php @@ -12,4 +12,6 @@ interface ImageInterface public function isAnimated(): bool; public function greyscale(): ImageInterface; public function encode(EncoderInterface $encoder): EncodedImage; + public function setLoops(int $count): ImageInterface; + public function loops(): int; }