mirror of
https://github.com/Intervention/image.git
synced 2025-08-12 00:43:59 +02:00
Refactor storage of Imagick core, remove method
Imagick core image was disassembled in the decoding process. This made the whole object not very memory efficient. This fixes the issue by keeping the original Imagick object in the Intervention Image object. Also the Image::getFrames() method was removed. Users should use iteration to access frames.
This commit is contained in:
@@ -6,6 +6,7 @@ use Intervention\Image\Exceptions\RuntimeException;
|
|||||||
use Intervention\Image\Interfaces\CollectionInterface;
|
use Intervention\Image\Interfaces\CollectionInterface;
|
||||||
use ArrayIterator;
|
use ArrayIterator;
|
||||||
use Countable;
|
use Countable;
|
||||||
|
use Traversable;
|
||||||
use IteratorAggregate;
|
use IteratorAggregate;
|
||||||
use RecursiveIteratorIterator;
|
use RecursiveIteratorIterator;
|
||||||
use RecursiveArrayIterator;
|
use RecursiveArrayIterator;
|
||||||
@@ -31,9 +32,9 @@ class Collection implements CollectionInterface, IteratorAggregate, Countable
|
|||||||
/**
|
/**
|
||||||
* Returns Iterator
|
* Returns Iterator
|
||||||
*
|
*
|
||||||
* @return \Traversable
|
* @return Traversable
|
||||||
*/
|
*/
|
||||||
public function getIterator(): \Traversable
|
public function getIterator(): Traversable
|
||||||
{
|
{
|
||||||
return new ArrayIterator($this->items);
|
return new ArrayIterator($this->items);
|
||||||
}
|
}
|
||||||
|
@@ -8,7 +8,6 @@ use Intervention\Image\Geometry\Point;
|
|||||||
use Intervention\Image\Geometry\Size;
|
use Intervention\Image\Geometry\Size;
|
||||||
use Intervention\Image\Interfaces\CollectionInterface;
|
use Intervention\Image\Interfaces\CollectionInterface;
|
||||||
use Intervention\Image\Interfaces\EncoderInterface;
|
use Intervention\Image\Interfaces\EncoderInterface;
|
||||||
use Intervention\Image\Interfaces\FrameInterface;
|
|
||||||
use Intervention\Image\Interfaces\ImageInterface;
|
use Intervention\Image\Interfaces\ImageInterface;
|
||||||
use Intervention\Image\Interfaces\ModifierInterface;
|
use Intervention\Image\Interfaces\ModifierInterface;
|
||||||
use Intervention\Image\Interfaces\SizeInterface;
|
use Intervention\Image\Interfaces\SizeInterface;
|
||||||
@@ -20,45 +19,6 @@ abstract class AbstractImage implements ImageInterface
|
|||||||
use CanResolveDriverClass;
|
use CanResolveDriverClass;
|
||||||
use CanHandleInput;
|
use CanHandleInput;
|
||||||
|
|
||||||
public function __construct(protected Collection $frames, protected $loops = 0)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getIterator(): CollectionInterface
|
|
||||||
{
|
|
||||||
return $this->frames;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getFrames(): CollectionInterface
|
|
||||||
{
|
|
||||||
return $this->frames;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getFrame(int $key = 0): ?FrameInterface
|
|
||||||
{
|
|
||||||
return $this->frames->get($key);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function addFrame(FrameInterface $frame): ImageInterface
|
|
||||||
{
|
|
||||||
$this->frames->push($frame);
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setLoops(int $count): ImageInterface
|
|
||||||
{
|
|
||||||
$this->loops = $count;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getLoops(): int
|
|
||||||
{
|
|
||||||
return $this->loops;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getSize(): SizeInterface
|
public function getSize(): SizeInterface
|
||||||
{
|
{
|
||||||
return new Size($this->getWidth(), $this->getHeight());
|
return new Size($this->getWidth(), $this->getHeight());
|
||||||
@@ -69,11 +29,6 @@ abstract class AbstractImage implements ImageInterface
|
|||||||
return $this->getSize();
|
return $this->getSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function isAnimated(): bool
|
|
||||||
{
|
|
||||||
return $this->getFrames()->count() > 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function modify(ModifierInterface $modifier): ImageInterface
|
public function modify(ModifierInterface $modifier): ImageInterface
|
||||||
{
|
{
|
||||||
return $modifier->apply($this);
|
return $modifier->apply($this);
|
||||||
@@ -229,7 +184,7 @@ abstract class AbstractImage implements ImageInterface
|
|||||||
public function pickColors(int $x, int $y): CollectionInterface
|
public function pickColors(int $x, int $y): CollectionInterface
|
||||||
{
|
{
|
||||||
$colors = new Collection();
|
$colors = new Collection();
|
||||||
foreach ($this->getFrames() as $key => $frame) {
|
foreach ($this as $key => $frame) {
|
||||||
$colors->push($this->pickColor($x, $y, $key));
|
$colors->push($this->pickColor($x, $y, $key));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -17,7 +17,7 @@ class GifEncoder extends AbstractEncoder implements EncoderInterface
|
|||||||
}
|
}
|
||||||
|
|
||||||
$data = $this->getBuffered(function () use ($image) {
|
$data = $this->getBuffered(function () use ($image) {
|
||||||
imagegif($image->getFrames()->first()->getCore());
|
imagegif($image->getFrame()->getCore());
|
||||||
});
|
});
|
||||||
|
|
||||||
return new EncodedImage($data, 'image/gif');
|
return new EncodedImage($data, 'image/gif');
|
||||||
|
@@ -17,7 +17,7 @@ class JpegEncoder extends AbstractEncoder implements EncoderInterface
|
|||||||
public function encode(ImageInterface $image): EncodedImage
|
public function encode(ImageInterface $image): EncodedImage
|
||||||
{
|
{
|
||||||
$data = $this->getBuffered(function () use ($image) {
|
$data = $this->getBuffered(function () use ($image) {
|
||||||
imagejpeg($image->getFrames()->first()->getCore(), null, $this->quality);
|
imagejpeg($image->getFrame()->getCore(), null, $this->quality);
|
||||||
});
|
});
|
||||||
|
|
||||||
return new EncodedImage($data, 'image/jpeg');
|
return new EncodedImage($data, 'image/jpeg');
|
||||||
|
@@ -12,7 +12,7 @@ class PngEncoder extends AbstractEncoder implements EncoderInterface
|
|||||||
public function encode(ImageInterface $image): EncodedImage
|
public function encode(ImageInterface $image): EncodedImage
|
||||||
{
|
{
|
||||||
$data = $this->getBuffered(function () use ($image) {
|
$data = $this->getBuffered(function () use ($image) {
|
||||||
imagepng($image->getFrames()->first()->getCore(), null, -1);
|
imagepng($image->getFrame()->getCore(), null, -1);
|
||||||
});
|
});
|
||||||
|
|
||||||
return new EncodedImage($data, 'image/png');
|
return new EncodedImage($data, 'image/png');
|
||||||
|
@@ -17,7 +17,7 @@ class WebpEncoder extends AbstractEncoder implements EncoderInterface
|
|||||||
public function encode(ImageInterface $image): EncodedImage
|
public function encode(ImageInterface $image): EncodedImage
|
||||||
{
|
{
|
||||||
$data = $this->getBuffered(function () use ($image) {
|
$data = $this->getBuffered(function () use ($image) {
|
||||||
imagewebp($image->getFrames()->first()->getCore(), null, $this->quality);
|
imagewebp($image->getFrame()->getCore(), null, $this->quality);
|
||||||
});
|
});
|
||||||
|
|
||||||
return new EncodedImage($data, 'image/webp');
|
return new EncodedImage($data, 'image/webp');
|
||||||
|
@@ -2,13 +2,60 @@
|
|||||||
|
|
||||||
namespace Intervention\Image\Drivers\Gd;
|
namespace Intervention\Image\Drivers\Gd;
|
||||||
|
|
||||||
|
use Intervention\Image\Collection;
|
||||||
use Intervention\Image\Drivers\Abstract\AbstractImage;
|
use Intervention\Image\Drivers\Abstract\AbstractImage;
|
||||||
use Intervention\Image\Interfaces\ColorInterface;
|
use Intervention\Image\Interfaces\ColorInterface;
|
||||||
|
use Intervention\Image\Interfaces\FrameInterface;
|
||||||
use Intervention\Image\Interfaces\ImageInterface;
|
use Intervention\Image\Interfaces\ImageInterface;
|
||||||
use IteratorAggregate;
|
use IteratorAggregate;
|
||||||
|
use Traversable;
|
||||||
|
|
||||||
class Image extends AbstractImage implements ImageInterface, IteratorAggregate
|
class Image extends AbstractImage implements ImageInterface, IteratorAggregate
|
||||||
{
|
{
|
||||||
|
public function __construct(protected Collection $frames, protected int $loops = 0)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getIterator(): Traversable
|
||||||
|
{
|
||||||
|
return $this->frames;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function count(): int
|
||||||
|
{
|
||||||
|
return $this->frames->count();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isAnimated(): bool
|
||||||
|
{
|
||||||
|
return $this->count() > 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getLoops(): int
|
||||||
|
{
|
||||||
|
return $this->loops;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setLoops(int $count): self
|
||||||
|
{
|
||||||
|
$this->loops = $count;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getFrame(int $key = 0): ?FrameInterface
|
||||||
|
{
|
||||||
|
return $this->frames->get($key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function addFrame(FrameInterface $frame): ImageInterface
|
||||||
|
{
|
||||||
|
$this->frames->push($frame);
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
public function getWidth(): int
|
public function getWidth(): int
|
||||||
{
|
{
|
||||||
return imagesx($this->getFrame()->getCore());
|
return imagesx($this->getFrame()->getCore());
|
||||||
|
@@ -3,9 +3,7 @@
|
|||||||
namespace Intervention\Image\Drivers\Imagick\Decoders;
|
namespace Intervention\Image\Drivers\Imagick\Decoders;
|
||||||
|
|
||||||
use Imagick;
|
use Imagick;
|
||||||
use Intervention\Image\Collection;
|
|
||||||
use Intervention\Image\Drivers\Abstract\Decoders\AbstractDecoder;
|
use Intervention\Image\Drivers\Abstract\Decoders\AbstractDecoder;
|
||||||
use Intervention\Image\Drivers\Imagick\Frame;
|
|
||||||
use Intervention\Image\Drivers\Imagick\Image;
|
use Intervention\Image\Drivers\Imagick\Image;
|
||||||
use Intervention\Image\Exceptions\DecoderException;
|
use Intervention\Image\Exceptions\DecoderException;
|
||||||
use Intervention\Image\Interfaces\ColorInterface;
|
use Intervention\Image\Interfaces\ColorInterface;
|
||||||
@@ -28,15 +26,9 @@ class BinaryImageDecoder extends AbstractDecoder implements DecoderInterface
|
|||||||
$imagick->readImageBlob($input);
|
$imagick->readImageBlob($input);
|
||||||
$imagick = $imagick->coalesceImages();
|
$imagick = $imagick->coalesceImages();
|
||||||
|
|
||||||
$image = new Image(new Collection());
|
$image = new Image($imagick);
|
||||||
$image->setLoops($imagick->getImageIterations());
|
$image->setLoops($imagick->getImageIterations());
|
||||||
|
|
||||||
foreach ($imagick as $frame_content) {
|
|
||||||
$image->addFrame(
|
|
||||||
new Frame($frame_content->getImage())
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $image;
|
return $image;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -16,7 +16,7 @@ class GifEncoder extends AbstractEncoder implements EncoderInterface
|
|||||||
$compression = Imagick::COMPRESSION_LZW;
|
$compression = Imagick::COMPRESSION_LZW;
|
||||||
|
|
||||||
$gif = new Imagick() ;
|
$gif = new Imagick() ;
|
||||||
foreach ($image->getFrames() as $frame) {
|
foreach ($image as $frame) {
|
||||||
$gif->addImage($frame->getCore());
|
$gif->addImage($frame->getCore());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -20,7 +20,7 @@ class JpegEncoder extends AbstractEncoder implements EncoderInterface
|
|||||||
$format = 'jpeg';
|
$format = 'jpeg';
|
||||||
$compression = Imagick::COMPRESSION_JPEG;
|
$compression = Imagick::COMPRESSION_JPEG;
|
||||||
|
|
||||||
$imagick = $image->getFrames()->first()->getCore();
|
$imagick = $image->getFrame()->getCore();
|
||||||
$imagick->setImageBackgroundColor('white');
|
$imagick->setImageBackgroundColor('white');
|
||||||
$imagick->setBackgroundColor('white');
|
$imagick->setBackgroundColor('white');
|
||||||
$imagick->setFormat($format);
|
$imagick->setFormat($format);
|
||||||
|
@@ -15,7 +15,7 @@ class PngEncoder extends AbstractEncoder implements EncoderInterface
|
|||||||
$format = 'png';
|
$format = 'png';
|
||||||
$compression = Imagick::COMPRESSION_ZIP;
|
$compression = Imagick::COMPRESSION_ZIP;
|
||||||
|
|
||||||
$imagick = $image->getFrames()->first()->getCore();
|
$imagick = $image->getFrame()->getCore();
|
||||||
$imagick->setFormat($format);
|
$imagick->setFormat($format);
|
||||||
$imagick->setImageFormat($format);
|
$imagick->setImageFormat($format);
|
||||||
$imagick->setCompression($compression);
|
$imagick->setCompression($compression);
|
||||||
|
@@ -21,7 +21,7 @@ class WebpEncoder extends AbstractEncoder implements EncoderInterface
|
|||||||
$format = 'webp';
|
$format = 'webp';
|
||||||
$compression = Imagick::COMPRESSION_ZIP;
|
$compression = Imagick::COMPRESSION_ZIP;
|
||||||
|
|
||||||
$imagick = $image->getFrames()->first()->getCore();
|
$imagick = $image->getFrame()->getCore();
|
||||||
$imagick->setImageBackgroundColor(new ImagickPixel('transparent'));
|
$imagick->setImageBackgroundColor(new ImagickPixel('transparent'));
|
||||||
|
|
||||||
$imagick = $imagick->mergeImageLayers(Imagick::LAYERMETHOD_MERGE);
|
$imagick = $imagick->mergeImageLayers(Imagick::LAYERMETHOD_MERGE);
|
||||||
|
@@ -3,7 +3,6 @@
|
|||||||
namespace Intervention\Image\Drivers\Imagick;
|
namespace Intervention\Image\Drivers\Imagick;
|
||||||
|
|
||||||
use Imagick;
|
use Imagick;
|
||||||
use Intervention\Image\Collection;
|
|
||||||
use Intervention\Image\Geometry\Size;
|
use Intervention\Image\Geometry\Size;
|
||||||
use Intervention\Image\Interfaces\FrameInterface;
|
use Intervention\Image\Interfaces\FrameInterface;
|
||||||
use Intervention\Image\Interfaces\ImageInterface;
|
use Intervention\Image\Interfaces\ImageInterface;
|
||||||
@@ -91,6 +90,6 @@ class Frame implements FrameInterface
|
|||||||
|
|
||||||
public function toImage(): ImageInterface
|
public function toImage(): ImageInterface
|
||||||
{
|
{
|
||||||
return new Image(new Collection([$this]));
|
return new Image($this->getCore());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -2,21 +2,122 @@
|
|||||||
|
|
||||||
namespace Intervention\Image\Drivers\Imagick;
|
namespace Intervention\Image\Drivers\Imagick;
|
||||||
|
|
||||||
|
use Imagick;
|
||||||
|
use ImagickException;
|
||||||
use Intervention\Image\Drivers\Abstract\AbstractImage;
|
use Intervention\Image\Drivers\Abstract\AbstractImage;
|
||||||
use Intervention\Image\Interfaces\ColorInterface;
|
use Intervention\Image\Interfaces\ColorInterface;
|
||||||
|
use Intervention\Image\Interfaces\FrameInterface;
|
||||||
use Intervention\Image\Interfaces\ImageInterface;
|
use Intervention\Image\Interfaces\ImageInterface;
|
||||||
use IteratorAggregate;
|
use Iterator;
|
||||||
|
|
||||||
class Image extends AbstractImage implements ImageInterface, IteratorAggregate
|
class Image extends AbstractImage implements ImageInterface, Iterator
|
||||||
{
|
{
|
||||||
|
protected $iteratorIndex = 0;
|
||||||
|
|
||||||
|
public function __construct(protected Imagick $core)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getCore(): Imagick
|
||||||
|
{
|
||||||
|
return $this->core;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getFrame(int $key = 0): ?FrameInterface
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$this->core->setIteratorIndex($key);
|
||||||
|
} catch (ImagickException $e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Frame($this->core->current());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function addFrame(FrameInterface $frame): ImageInterface
|
||||||
|
{
|
||||||
|
$imagick = $frame->getCore();
|
||||||
|
|
||||||
|
$imagick->setImageDelay($frame->getDelay());
|
||||||
|
$imagick->setImageDispose($frame->getDispose());
|
||||||
|
|
||||||
|
$size = $frame->getSize();
|
||||||
|
$imagick->setImagePage(
|
||||||
|
$size->getWidth(),
|
||||||
|
$size->getHeight(),
|
||||||
|
$frame->getOffsetLeft(),
|
||||||
|
$frame->getOffsetTop()
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->core->addImage($imagick);
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setLoops(int $count): ImageInterface
|
||||||
|
{
|
||||||
|
$this->core->setImageIterations($count);
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getLoops(): int
|
||||||
|
{
|
||||||
|
return $this->core->getImageIterations();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isAnimated(): bool
|
||||||
|
{
|
||||||
|
return $this->count() > 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function count(): int
|
||||||
|
{
|
||||||
|
return $this->core->getNumberImages();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function current()
|
||||||
|
{
|
||||||
|
$this->core->setIteratorIndex($this->iteratorIndex);
|
||||||
|
|
||||||
|
return new Frame($this->core->current());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function key()
|
||||||
|
{
|
||||||
|
return $this->iteratorIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function next(): void
|
||||||
|
{
|
||||||
|
$this->iteratorIndex = $this->iteratorIndex + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function rewind(): void
|
||||||
|
{
|
||||||
|
$this->iteratorIndex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function valid(): bool
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$result = $this->core->setIteratorIndex($this->iteratorIndex);
|
||||||
|
} catch (ImagickException $e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
public function getWidth(): int
|
public function getWidth(): int
|
||||||
{
|
{
|
||||||
return $this->frames->first()->getCore()->getImageWidth();
|
return $this->getFrame()->getCore()->getImageWidth();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getHeight(): int
|
public function getHeight(): int
|
||||||
{
|
{
|
||||||
return $this->frames->first()->getCore()->getImageHeight();
|
return $this->getFrame()->getCore()->getImageHeight();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function pickColor(int $x, int $y, int $frame_key = 0): ?ColorInterface
|
public function pickColor(int $x, int $y, int $frame_key = 0): ?ColorInterface
|
||||||
|
@@ -4,8 +4,6 @@ namespace Intervention\Image\Drivers\Imagick;
|
|||||||
|
|
||||||
use Imagick;
|
use Imagick;
|
||||||
use ImagickPixel;
|
use ImagickPixel;
|
||||||
use Intervention\Image\Collection;
|
|
||||||
use Intervention\Image\Drivers\Imagick\Color;
|
|
||||||
use Intervention\Image\Interfaces\FactoryInterface;
|
use Intervention\Image\Interfaces\FactoryInterface;
|
||||||
use Intervention\Image\Interfaces\ImageInterface;
|
use Intervention\Image\Interfaces\ImageInterface;
|
||||||
|
|
||||||
@@ -13,11 +11,7 @@ class ImageFactory implements FactoryInterface
|
|||||||
{
|
{
|
||||||
public function newImage(int $width, int $height): ImageInterface
|
public function newImage(int $width, int $height): ImageInterface
|
||||||
{
|
{
|
||||||
return new Image(
|
return new Image($this->newCore($width, $height));
|
||||||
new Collection([
|
|
||||||
new Frame($this->newCore($width, $height))
|
|
||||||
])
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function newCore(int $width, int $height): Imagick
|
public function newCore(int $width, int $height): Imagick
|
||||||
|
@@ -2,7 +2,9 @@
|
|||||||
|
|
||||||
namespace Intervention\Image\Interfaces;
|
namespace Intervention\Image\Interfaces;
|
||||||
|
|
||||||
interface CollectionInterface
|
use Traversable;
|
||||||
|
|
||||||
|
interface CollectionInterface extends Traversable
|
||||||
{
|
{
|
||||||
public function push($item): CollectionInterface;
|
public function push($item): CollectionInterface;
|
||||||
public function get(int $key, $default = null);
|
public function get(int $key, $default = null);
|
||||||
|
@@ -2,12 +2,12 @@
|
|||||||
|
|
||||||
namespace Intervention\Image\Interfaces;
|
namespace Intervention\Image\Interfaces;
|
||||||
|
|
||||||
|
use Countable;
|
||||||
use Intervention\Image\EncodedImage;
|
use Intervention\Image\EncodedImage;
|
||||||
|
use Traversable;
|
||||||
|
|
||||||
interface ImageInterface
|
interface ImageInterface extends Traversable, Countable
|
||||||
{
|
{
|
||||||
public function getIterator(): CollectionInterface;
|
|
||||||
public function getFrames(): CollectionInterface;
|
|
||||||
public function getFrame(int $key = 0): ?FrameInterface;
|
public function getFrame(int $key = 0): ?FrameInterface;
|
||||||
public function addFrame(FrameInterface $frame): ImageInterface;
|
public function addFrame(FrameInterface $frame): ImageInterface;
|
||||||
public function setLoops(int $count): ImageInterface;
|
public function setLoops(int $count): ImageInterface;
|
||||||
|
@@ -30,58 +30,17 @@ class AbstractImageTest extends TestCase
|
|||||||
|
|
||||||
$collection = new Collection([$frame1, $frame2, $frame3]);
|
$collection = new Collection([$frame1, $frame2, $frame3]);
|
||||||
|
|
||||||
$mock = Mockery::mock(AbstractImage::class, ImageInterface::class, [$collection])
|
$mock = Mockery::mock(AbstractImage::class, ImageInterface::class)
|
||||||
->shouldAllowMockingProtectedMethods()
|
->shouldAllowMockingProtectedMethods()
|
||||||
->makePartial();
|
->makePartial();
|
||||||
|
|
||||||
$mock->shouldReceive('getWidth')->andReturn(300);
|
$mock->shouldReceive('getWidth')->andReturn(300);
|
||||||
$mock->shouldReceive('getHeight')->andReturn(200);
|
$mock->shouldReceive('getHeight')->andReturn(200);
|
||||||
|
$mock->shouldReceive('getIterator')->andReturn($collection);
|
||||||
|
|
||||||
return $mock;
|
return $mock;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGetIterator(): void
|
|
||||||
{
|
|
||||||
$this->assertInstanceOf(Collection::class, $this->abstractImageMock()->getIterator());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testGetFrames(): void
|
|
||||||
{
|
|
||||||
$this->assertInstanceOf(Collection::class, $this->abstractImageMock()->getFrames());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testGetFrame(): void
|
|
||||||
{
|
|
||||||
$img = $this->abstractImageMock();
|
|
||||||
|
|
||||||
$this->assertInstanceOf(FrameInterface::class, $img->getFrame());
|
|
||||||
$this->assertEquals(1, $img->getFrame()->ident());
|
|
||||||
|
|
||||||
$this->assertInstanceOf(FrameInterface::class, $img->getFrame(1));
|
|
||||||
$this->assertEquals(2, $img->getFrame(1)->ident());
|
|
||||||
|
|
||||||
$this->assertInstanceOf(FrameInterface::class, $img->getFrame(2));
|
|
||||||
$this->assertEquals(3, $img->getFrame(2)->ident());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testAddFrame(): void
|
|
||||||
{
|
|
||||||
$img = $this->abstractImageMock();
|
|
||||||
$this->assertEquals(3, $img->getFrames()->count());
|
|
||||||
$result = $img->addFrame(Mockery::mock(FrameInterface::class));
|
|
||||||
$this->assertInstanceOf(AbstractImage::class, $result);
|
|
||||||
$this->assertEquals(4, $img->getFrames()->count());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testSetGetLoops(): void
|
|
||||||
{
|
|
||||||
$img = $this->abstractImageMock();
|
|
||||||
$this->assertEquals(0, $img->getLoops());
|
|
||||||
$result = $img->setLoops(10);
|
|
||||||
$this->assertEquals(10, $img->getLoops());
|
|
||||||
$this->assertInstanceOf(AbstractImage::class, $result);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testGetSize(): void
|
public function testGetSize(): void
|
||||||
{
|
{
|
||||||
$img = $this->abstractImageMock();
|
$img = $this->abstractImageMock();
|
||||||
@@ -98,19 +57,6 @@ class AbstractImageTest extends TestCase
|
|||||||
$this->assertEquals(200, $img->size()->getHeight());
|
$this->assertEquals(200, $img->size()->getHeight());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testIsAnimated(): void
|
|
||||||
{
|
|
||||||
$img = Mockery::mock(AbstractImage::class, [new Collection()])->makePartial();
|
|
||||||
$this->assertFalse($img->isAnimated());
|
|
||||||
|
|
||||||
$collection = new Collection([
|
|
||||||
Mockery::mock(FrameInterface::class),
|
|
||||||
Mockery::mock(FrameInterface::class),
|
|
||||||
]);
|
|
||||||
$img = Mockery::mock(AbstractImage::class, [$collection])->makePartial();
|
|
||||||
$this->assertTrue($img->isAnimated());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testModify(): void
|
public function testModify(): void
|
||||||
{
|
{
|
||||||
$img = $this->abstractImageMock();
|
$img = $this->abstractImageMock();
|
||||||
|
@@ -37,6 +37,12 @@ class ImageTest extends TestCase
|
|||||||
$this->assertInstanceOf(Image::class, $this->image);
|
$this->assertInstanceOf(Image::class, $this->image);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testCount(): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(3, $this->image->count());
|
||||||
|
$this->assertEquals(3, count($this->image));
|
||||||
|
}
|
||||||
|
|
||||||
public function testIterator(): void
|
public function testIterator(): void
|
||||||
{
|
{
|
||||||
foreach ($this->image as $frame) {
|
foreach ($this->image as $frame) {
|
||||||
@@ -44,12 +50,6 @@ class ImageTest extends TestCase
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGetFrames(): void
|
|
||||||
{
|
|
||||||
$this->assertInstanceOf(Collection::class, $this->image->getFrames());
|
|
||||||
$this->assertCount(3, $this->image->getFrames());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testGetFrame(): void
|
public function testGetFrame(): void
|
||||||
{
|
{
|
||||||
$this->assertInstanceOf(Frame::class, $this->image->getFrame());
|
$this->assertInstanceOf(Frame::class, $this->image->getFrame());
|
||||||
@@ -58,10 +58,10 @@ class ImageTest extends TestCase
|
|||||||
|
|
||||||
public function testAddFrame(): void
|
public function testAddFrame(): void
|
||||||
{
|
{
|
||||||
$this->assertCount(3, $this->image->getFrames());
|
$this->assertCount(3, $this->image);
|
||||||
$result = $this->image->addFrame(new Frame(imagecreatetruecolor(3, 2)));
|
$result = $this->image->addFrame(new Frame(imagecreatetruecolor(3, 2)));
|
||||||
$this->assertInstanceOf(Image::class, $result);
|
$this->assertInstanceOf(Image::class, $result);
|
||||||
$this->assertCount(4, $this->image->getFrames());
|
$this->assertCount(4, $this->image);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testSetGetLoops(): void
|
public function testSetGetLoops(): void
|
||||||
|
@@ -20,20 +20,24 @@ class GifEncoderTest extends TestCase
|
|||||||
{
|
{
|
||||||
protected function getTestImage(): Image
|
protected function getTestImage(): Image
|
||||||
{
|
{
|
||||||
$imagick1 = new Imagick();
|
$imagick = new Imagick();
|
||||||
$imagick1->newImage(30, 20, new ImagickPixel('red'), 'png');
|
|
||||||
$frame1 = new Frame($imagick1);
|
|
||||||
$frame1->setDelay(50);
|
|
||||||
$imagick2 = new Imagick();
|
|
||||||
$imagick2->newImage(30, 20, new ImagickPixel('green'), 'png');
|
|
||||||
$frame2 = new Frame($imagick2);
|
|
||||||
$frame2->setDelay(50);
|
|
||||||
$imagick3 = new Imagick();
|
|
||||||
$imagick3->newImage(30, 20, new ImagickPixel('blue'), 'png');
|
|
||||||
$frame3 = new Frame($imagick3);
|
|
||||||
$frame3->setDelay(50);
|
|
||||||
|
|
||||||
return new Image(new Collection([$frame1, $frame2, $frame3]));
|
$frame = new Imagick();
|
||||||
|
$frame->newImage(30, 20, new ImagickPixel('red'), 'png');
|
||||||
|
$frame->setImageDelay(50);
|
||||||
|
$imagick->addImage($frame);
|
||||||
|
|
||||||
|
$frame = new Imagick();
|
||||||
|
$frame->newImage(30, 20, new ImagickPixel('green'), 'png');
|
||||||
|
$frame->setImageDelay(50);
|
||||||
|
$imagick->addImage($frame);
|
||||||
|
|
||||||
|
$frame = new Imagick();
|
||||||
|
$frame->newImage(30, 20, new ImagickPixel('blue'), 'png');
|
||||||
|
$frame->setImageDelay(50);
|
||||||
|
$imagick->addImage($frame);
|
||||||
|
|
||||||
|
return new Image($imagick);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testEncode(): void
|
public function testEncode(): void
|
||||||
|
@@ -4,9 +4,7 @@ namespace Intervention\Image\Tests\Drivers\Imagick\Encoders;
|
|||||||
|
|
||||||
use Imagick;
|
use Imagick;
|
||||||
use ImagickPixel;
|
use ImagickPixel;
|
||||||
use Intervention\Image\Collection;
|
|
||||||
use Intervention\Image\Drivers\Imagick\Encoders\JpegEncoder;
|
use Intervention\Image\Drivers\Imagick\Encoders\JpegEncoder;
|
||||||
use Intervention\Image\Drivers\Imagick\Frame;
|
|
||||||
use Intervention\Image\Drivers\Imagick\Image;
|
use Intervention\Image\Drivers\Imagick\Image;
|
||||||
use Intervention\Image\Tests\TestCase;
|
use Intervention\Image\Tests\TestCase;
|
||||||
use Intervention\MimeSniffer\MimeSniffer;
|
use Intervention\MimeSniffer\MimeSniffer;
|
||||||
@@ -22,9 +20,8 @@ class JpegEncoderTest extends TestCase
|
|||||||
{
|
{
|
||||||
$imagick = new Imagick();
|
$imagick = new Imagick();
|
||||||
$imagick->newImage(3, 2, new ImagickPixel('red'), 'png');
|
$imagick->newImage(3, 2, new ImagickPixel('red'), 'png');
|
||||||
$frame = new Frame($imagick);
|
|
||||||
|
|
||||||
return new Image(new Collection([$frame]));
|
return new Image($imagick);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testEncode(): void
|
public function testEncode(): void
|
||||||
|
@@ -6,9 +6,7 @@ namespace Intervention\Image\Tests\Drivers\Imagick\Encoders;
|
|||||||
|
|
||||||
use Imagick;
|
use Imagick;
|
||||||
use ImagickPixel;
|
use ImagickPixel;
|
||||||
use Intervention\Image\Collection;
|
|
||||||
use Intervention\Image\Drivers\Imagick\Encoders\PngEncoder;
|
use Intervention\Image\Drivers\Imagick\Encoders\PngEncoder;
|
||||||
use Intervention\Image\Drivers\Imagick\Frame;
|
|
||||||
use Intervention\Image\Drivers\Imagick\Image;
|
use Intervention\Image\Drivers\Imagick\Image;
|
||||||
use Intervention\MimeSniffer\MimeSniffer;
|
use Intervention\MimeSniffer\MimeSniffer;
|
||||||
use Intervention\MimeSniffer\Types\ImagePng;
|
use Intervention\MimeSniffer\Types\ImagePng;
|
||||||
@@ -23,9 +21,8 @@ final class PngEncoderTest extends TestCase
|
|||||||
{
|
{
|
||||||
$imagick = new Imagick();
|
$imagick = new Imagick();
|
||||||
$imagick->newImage(3, 2, new ImagickPixel('red'), 'jpg');
|
$imagick->newImage(3, 2, new ImagickPixel('red'), 'jpg');
|
||||||
$frame = new Frame($imagick);
|
|
||||||
|
|
||||||
return new Image(new Collection([$frame]));
|
return new Image($imagick);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testEncode(): void
|
public function testEncode(): void
|
||||||
|
@@ -6,9 +6,7 @@ namespace Intervention\Image\Tests\Drivers\Imagick\Encoders;
|
|||||||
|
|
||||||
use Imagick;
|
use Imagick;
|
||||||
use ImagickPixel;
|
use ImagickPixel;
|
||||||
use Intervention\Image\Collection;
|
|
||||||
use Intervention\Image\Drivers\Imagick\Encoders\WebpEncoder;
|
use Intervention\Image\Drivers\Imagick\Encoders\WebpEncoder;
|
||||||
use Intervention\Image\Drivers\Imagick\Frame;
|
|
||||||
use Intervention\Image\Drivers\Imagick\Image;
|
use Intervention\Image\Drivers\Imagick\Image;
|
||||||
use Intervention\MimeSniffer\MimeSniffer;
|
use Intervention\MimeSniffer\MimeSniffer;
|
||||||
use Intervention\MimeSniffer\Types\ImageWebp;
|
use Intervention\MimeSniffer\Types\ImageWebp;
|
||||||
@@ -23,9 +21,8 @@ final class WebpEncoderTest extends TestCase
|
|||||||
{
|
{
|
||||||
$imagick = new Imagick();
|
$imagick = new Imagick();
|
||||||
$imagick->newImage(3, 2, new ImagickPixel('red'), 'png');
|
$imagick->newImage(3, 2, new ImagickPixel('red'), 'png');
|
||||||
$frame = new Frame($imagick);
|
|
||||||
|
|
||||||
return new Image(new Collection([$frame]));
|
return new Image($imagick);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testEncode(): void
|
public function testEncode(): void
|
||||||
|
@@ -4,7 +4,6 @@ namespace Intervention\Image\Tests\Drivers\Imagick;
|
|||||||
|
|
||||||
use Imagick;
|
use Imagick;
|
||||||
use ImagickPixel;
|
use ImagickPixel;
|
||||||
use Intervention\Image\Collection;
|
|
||||||
use Intervention\Image\Drivers\Imagick\Frame;
|
use Intervention\Image\Drivers\Imagick\Frame;
|
||||||
use Intervention\Image\Drivers\Imagick\Image;
|
use Intervention\Image\Drivers\Imagick\Image;
|
||||||
use Intervention\Image\Geometry\Size;
|
use Intervention\Image\Geometry\Size;
|
||||||
@@ -20,16 +19,46 @@ class ImageTest extends TestCase
|
|||||||
|
|
||||||
protected function setUp(): void
|
protected function setUp(): void
|
||||||
{
|
{
|
||||||
|
// create base image
|
||||||
$imagick = new Imagick();
|
$imagick = new Imagick();
|
||||||
$imagick->newImage(3, 2, new ImagickPixel('red'), 'png');
|
|
||||||
|
|
||||||
$this->image = new Image(new Collection([new Frame($imagick)]));
|
// add frame
|
||||||
|
$frame = new Imagick();
|
||||||
|
$frame->newImage(3, 2, new ImagickPixel('red'), 'png');
|
||||||
|
$imagick->addImage($frame);
|
||||||
|
|
||||||
|
// add frame
|
||||||
|
$frame = new Imagick();
|
||||||
|
$frame->newImage(3, 2, new ImagickPixel('green'), 'png');
|
||||||
|
$imagick->addImage($frame);
|
||||||
|
|
||||||
|
// create intervention image
|
||||||
|
$this->image = new Image($imagick);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testConstructor(): void
|
public function testConstructor(): void
|
||||||
{
|
{
|
||||||
$this->assertInstanceOf(Image::class, $this->image);
|
$this->assertInstanceOf(Image::class, $this->image);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testGetFrame(): void
|
||||||
|
{
|
||||||
|
$this->assertInstanceOf(Frame::class, $this->image->getFrame());
|
||||||
|
$this->assertInstanceOf(Frame::class, $this->image->getFrame(1));
|
||||||
|
$this->assertNull($this->image->getFrame(2));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testAddFrame(): void
|
||||||
|
{
|
||||||
|
$frame = new Imagick();
|
||||||
|
$frame->newImage(3, 2, new ImagickPixel('blue'), 'png');
|
||||||
|
$frame = new Frame($frame);
|
||||||
|
|
||||||
|
$this->assertCount(2, $this->image);
|
||||||
|
$result = $this->image->addFrame($frame);
|
||||||
|
$this->assertInstanceOf(Image::class, $result);
|
||||||
|
$this->assertCount(3, $this->image);
|
||||||
|
}
|
||||||
|
|
||||||
public function testIterator(): void
|
public function testIterator(): void
|
||||||
{
|
{
|
||||||
@@ -38,6 +67,12 @@ class ImageTest extends TestCase
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testCount(): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(2, $this->image->count());
|
||||||
|
$this->assertEquals(2, count($this->image));
|
||||||
|
}
|
||||||
|
|
||||||
public function testWidth(): void
|
public function testWidth(): void
|
||||||
{
|
{
|
||||||
$this->assertEquals(3, $this->image->getWidth());
|
$this->assertEquals(3, $this->image->getWidth());
|
||||||
|
Reference in New Issue
Block a user