1
0
mirror of https://github.com/Intervention/image.git synced 2025-08-20 04:31:24 +02:00

Optimize GifEncoder of imagick driver

Imagick object is accessed directly instead of frame by frame.
This commit is contained in:
Oliver Vogel
2022-06-21 09:59:29 +02:00
parent 90ed724cb5
commit bf8e3a1fc7
2 changed files with 19 additions and 24 deletions

View File

@@ -15,18 +15,13 @@ class GifEncoder extends AbstractEncoder implements EncoderInterface
$format = 'gif'; $format = 'gif';
$compression = Imagick::COMPRESSION_LZW; $compression = Imagick::COMPRESSION_LZW;
$gif = new Imagick() ; $imagick = $image->getImagick();
foreach ($image as $frame) { $imagick->setFormat($format);
$gif->addImage($frame->getCore()); $imagick->setImageFormat($format);
} $imagick->setCompression($compression);
$imagick->setImageCompression($compression);
$imagick = $imagick->deconstructImages();
$gif->setImageIterations($image->getLoops()); return new EncodedImage($imagick->getImagesBlob(), 'image/gif');
$gif->setFormat($format);
$gif->setImageFormat($format);
$gif->setCompression($compression);
$gif->setImageCompression($compression);
$gif = $gif->deconstructImages();
return new EncodedImage($gif->getImagesBlob(), 'image/gif');
} }
} }

View File

@@ -14,25 +14,25 @@ class Image extends AbstractImage implements ImageInterface, Iterator
{ {
protected $iteratorIndex = 0; protected $iteratorIndex = 0;
public function __construct(protected Imagick $core) public function __construct(protected Imagick $imagick)
{ {
// //
} }
public function getCore(): Imagick public function getImagick(): Imagick
{ {
return $this->core; return $this->imagick;
} }
public function getFrame(int $key = 0): ?FrameInterface public function getFrame(int $key = 0): ?FrameInterface
{ {
try { try {
$this->core->setIteratorIndex($key); $this->imagick->setIteratorIndex($key);
} catch (ImagickException $e) { } catch (ImagickException $e) {
return null; return null;
} }
return new Frame($this->core->current()); return new Frame($this->imagick->current());
} }
public function addFrame(FrameInterface $frame): ImageInterface public function addFrame(FrameInterface $frame): ImageInterface
@@ -50,21 +50,21 @@ class Image extends AbstractImage implements ImageInterface, Iterator
$frame->getOffsetTop() $frame->getOffsetTop()
); );
$this->core->addImage($imagick); $this->imagick->addImage($imagick);
return $this; return $this;
} }
public function setLoops(int $count): ImageInterface public function setLoops(int $count): ImageInterface
{ {
$this->core->setImageIterations($count); $this->imagick->setImageIterations($count);
return $this; return $this;
} }
public function getLoops(): int public function getLoops(): int
{ {
return $this->core->getImageIterations(); return $this->imagick->getImageIterations();
} }
public function isAnimated(): bool public function isAnimated(): bool
@@ -74,14 +74,14 @@ class Image extends AbstractImage implements ImageInterface, Iterator
public function count(): int public function count(): int
{ {
return $this->core->getNumberImages(); return $this->imagick->getNumberImages();
} }
public function current() public function current()
{ {
$this->core->setIteratorIndex($this->iteratorIndex); $this->imagick->setIteratorIndex($this->iteratorIndex);
return new Frame($this->core->current()); return new Frame($this->imagick->current());
} }
public function key() public function key()
@@ -102,7 +102,7 @@ class Image extends AbstractImage implements ImageInterface, Iterator
public function valid(): bool public function valid(): bool
{ {
try { try {
$result = $this->core->setIteratorIndex($this->iteratorIndex); $result = $this->imagick->setIteratorIndex($this->iteratorIndex);
} catch (ImagickException $e) { } catch (ImagickException $e) {
return false; return false;
} }