diff --git a/src/Drivers/Gd/Encoders/GifEncoder.php b/src/Drivers/Gd/Encoders/GifEncoder.php index af29e899..e5253491 100644 --- a/src/Drivers/Gd/Encoders/GifEncoder.php +++ b/src/Drivers/Gd/Encoders/GifEncoder.php @@ -23,7 +23,9 @@ public function encode(ImageInterface $image): EncodedImage $gd = $image->core()->native(); $data = $this->buffered(function () use ($gd) { + imageinterlace($gd, $this->interlaced); imagegif($gd); + imageinterlace($gd, false); }); return new EncodedImage($data, 'image/gif'); diff --git a/src/Drivers/Imagick/Encoders/GifEncoder.php b/src/Drivers/Imagick/Encoders/GifEncoder.php index 84a327a1..41783a39 100644 --- a/src/Drivers/Imagick/Encoders/GifEncoder.php +++ b/src/Drivers/Imagick/Encoders/GifEncoder.php @@ -24,6 +24,10 @@ public function encode(ImageInterface $image): EncodedImage $imagick->setCompression($compression); $imagick->setImageCompression($compression); + if ($this->interlaced) { + $imagick->setInterlaceScheme(Imagick::INTERLACE_LINE); + } + return new EncodedImage($imagick->getImagesBlob(), 'image/gif'); } } diff --git a/src/Encoders/GifEncoder.php b/src/Encoders/GifEncoder.php index 168cbf86..2f5d0744 100644 --- a/src/Encoders/GifEncoder.php +++ b/src/Encoders/GifEncoder.php @@ -8,7 +8,7 @@ class GifEncoder extends SpecializableEncoder { - public function __construct() + public function __construct(public bool $interlaced = false) { } } diff --git a/tests/Unit/Drivers/Gd/Encoders/GifEncoderTest.php b/tests/Unit/Drivers/Gd/Encoders/GifEncoderTest.php index 4bcd26a5..f19fe060 100644 --- a/tests/Unit/Drivers/Gd/Encoders/GifEncoderTest.php +++ b/tests/Unit/Drivers/Gd/Encoders/GifEncoderTest.php @@ -4,6 +4,7 @@ namespace Intervention\Image\Tests\Unit\Drivers\Gd\Encoders; +use Intervention\Gif\Decoder; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\RequiresPhpExtension; use Intervention\Image\Encoders\GifEncoder; @@ -20,5 +21,19 @@ public function testEncode(): void $encoder = new GifEncoder(); $result = $encoder->encode($image); $this->assertMediaType('image/gif', (string) $result); + $this->assertFalse( + Decoder::decode((string) $result)->getFirstFrame()->getImageDescriptor()->isInterlaced() + ); + } + + public function testEncodeInterlaced(): void + { + $image = $this->createTestImage(3, 2); + $encoder = new GifEncoder(interlaced: true); + $result = $encoder->encode($image); + $this->assertMediaType('image/gif', (string) $result); + $this->assertTrue( + Decoder::decode((string) $result)->getFirstFrame()->getImageDescriptor()->isInterlaced() + ); } } diff --git a/tests/Unit/Drivers/Imagick/Encoders/GifEncoderTest.php b/tests/Unit/Drivers/Imagick/Encoders/GifEncoderTest.php index ee61bf8a..43beba64 100644 --- a/tests/Unit/Drivers/Imagick/Encoders/GifEncoderTest.php +++ b/tests/Unit/Drivers/Imagick/Encoders/GifEncoderTest.php @@ -4,6 +4,7 @@ namespace Intervention\Image\Tests\Unit\Drivers\Imagick\Encoders; +use Intervention\Gif\Decoder; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\RequiresPhpExtension; use Intervention\Image\Encoders\GifEncoder; @@ -20,5 +21,19 @@ public function testEncode(): void $encoder = new GifEncoder(); $result = $encoder->encode($image); $this->assertMediaType('image/gif', (string) $result); + $this->assertFalse( + Decoder::decode((string) $result)->getFirstFrame()->getImageDescriptor()->isInterlaced() + ); + } + + public function testEncodeInterlaced(): void + { + $image = $this->createTestImage(3, 2); + $encoder = new GifEncoder(interlaced: true); + $result = $encoder->encode($image); + $this->assertMediaType('image/gif', (string) $result); + $this->assertTrue( + Decoder::decode((string) $result)->getFirstFrame()->getImageDescriptor()->isInterlaced() + ); } }