mirror of
https://github.com/Intervention/image.git
synced 2025-08-20 12:41:23 +02:00
Add animation creation
This commit is contained in:
@@ -45,4 +45,14 @@ class Core extends Collection implements CoreInterface
|
|||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function first(): FrameInterface
|
||||||
|
{
|
||||||
|
return parent::first();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function last(): FrameInterface
|
||||||
|
{
|
||||||
|
return parent::last();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -7,15 +7,26 @@ use Intervention\Image\Image;
|
|||||||
use Intervention\Image\Interfaces\ColorInterface;
|
use Intervention\Image\Interfaces\ColorInterface;
|
||||||
use Intervention\Image\Interfaces\ColorProcessorInterface;
|
use Intervention\Image\Interfaces\ColorProcessorInterface;
|
||||||
use Intervention\Image\Interfaces\ColorspaceInterface;
|
use Intervention\Image\Interfaces\ColorspaceInterface;
|
||||||
|
use Intervention\Image\Interfaces\DriverInterface;
|
||||||
use Intervention\Image\Interfaces\ImageInterface;
|
use Intervention\Image\Interfaces\ImageInterface;
|
||||||
|
|
||||||
class Driver extends AbstractDriver
|
class Driver extends AbstractDriver
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*
|
||||||
|
* @see DriverInterface::id()
|
||||||
|
*/
|
||||||
public function id(): string
|
public function id(): string
|
||||||
{
|
{
|
||||||
return 'GD';
|
return 'GD';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*
|
||||||
|
* @see DriverInterface::createImage()
|
||||||
|
*/
|
||||||
public function createImage(int $width, int $height): ImageInterface
|
public function createImage(int $width, int $height): ImageInterface
|
||||||
{
|
{
|
||||||
// build new transparent GDImage
|
// build new transparent GDImage
|
||||||
@@ -34,11 +45,59 @@ class Driver extends AbstractDriver
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*
|
||||||
|
* @see DriverInterface::createAnimation()
|
||||||
|
*/
|
||||||
|
public function createAnimation(callable $init): ImageInterface
|
||||||
|
{
|
||||||
|
$animation = new class ($this)
|
||||||
|
{
|
||||||
|
public function __construct(
|
||||||
|
protected DriverInterface $driver,
|
||||||
|
public Core $core = new Core()
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public function add($source, float $delay = 1): self
|
||||||
|
{
|
||||||
|
$this->core->add(
|
||||||
|
$this->driver->handleInput($source)->core()->first()->setDelay($delay)
|
||||||
|
);
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __invoke(): ImageInterface
|
||||||
|
{
|
||||||
|
return new Image(
|
||||||
|
$this->driver,
|
||||||
|
$this->core
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$init($animation);
|
||||||
|
|
||||||
|
return call_user_func($animation);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*
|
||||||
|
* @see DriverInterface::handleInput()
|
||||||
|
*/
|
||||||
public function handleInput(mixed $input): ImageInterface|ColorInterface
|
public function handleInput(mixed $input): ImageInterface|ColorInterface
|
||||||
{
|
{
|
||||||
return (new InputHandler())->handle($input);
|
return (new InputHandler())->handle($input);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*
|
||||||
|
* @see DriverInterface::colorProcessor()
|
||||||
|
*/
|
||||||
public function colorProcessor(ColorspaceInterface $colorspace): ColorProcessorInterface
|
public function colorProcessor(ColorspaceInterface $colorspace): ColorProcessorInterface
|
||||||
{
|
{
|
||||||
return new ColorProcessor($colorspace);
|
return new ColorProcessor($colorspace);
|
||||||
|
@@ -110,4 +110,14 @@ class Core implements CoreInterface, Iterator
|
|||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function first(): FrameInterface
|
||||||
|
{
|
||||||
|
return $this->frame(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function last(): FrameInterface
|
||||||
|
{
|
||||||
|
return $this->frame($this->count());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -9,15 +9,26 @@ use Intervention\Image\Image;
|
|||||||
use Intervention\Image\Interfaces\ColorInterface;
|
use Intervention\Image\Interfaces\ColorInterface;
|
||||||
use Intervention\Image\Interfaces\ColorProcessorInterface;
|
use Intervention\Image\Interfaces\ColorProcessorInterface;
|
||||||
use Intervention\Image\Interfaces\ColorspaceInterface;
|
use Intervention\Image\Interfaces\ColorspaceInterface;
|
||||||
|
use Intervention\Image\Interfaces\DriverInterface;
|
||||||
use Intervention\Image\Interfaces\ImageInterface;
|
use Intervention\Image\Interfaces\ImageInterface;
|
||||||
|
|
||||||
class Driver extends AbstractDriver
|
class Driver extends AbstractDriver
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*
|
||||||
|
* @see DriverInterface::id()
|
||||||
|
*/
|
||||||
public function id(): string
|
public function id(): string
|
||||||
{
|
{
|
||||||
return 'Imagick';
|
return 'Imagick';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*
|
||||||
|
* @see DriverInterface::createImage()
|
||||||
|
*/
|
||||||
public function createImage(int $width, int $height): ImageInterface
|
public function createImage(int $width, int $height): ImageInterface
|
||||||
{
|
{
|
||||||
$background = new ImagickPixel('rgba(0, 0, 0, 0)');
|
$background = new ImagickPixel('rgba(0, 0, 0, 0)');
|
||||||
@@ -32,11 +43,63 @@ class Driver extends AbstractDriver
|
|||||||
return new Image($this, new Core($imagick));
|
return new Image($this, new Core($imagick));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*
|
||||||
|
* @see DriverInterface::createAnimation()
|
||||||
|
*/
|
||||||
|
public function createAnimation(callable $init): ImageInterface
|
||||||
|
{
|
||||||
|
$imagick = new Imagick();
|
||||||
|
$imagick->setFormat('gif');
|
||||||
|
|
||||||
|
$animation = new class ($this, $imagick)
|
||||||
|
{
|
||||||
|
public function __construct(
|
||||||
|
protected DriverInterface $driver,
|
||||||
|
public Imagick $imagick
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public function add($source, float $delay = 1): self
|
||||||
|
{
|
||||||
|
$native = $this->driver->handleInput($source)->core()->native();
|
||||||
|
$native->setImageDelay($delay * 100);
|
||||||
|
|
||||||
|
$this->imagick->addImage($native);
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __invoke(): ImageInterface
|
||||||
|
{
|
||||||
|
return new Image(
|
||||||
|
$this->driver,
|
||||||
|
new Core($this->imagick)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$init($animation);
|
||||||
|
|
||||||
|
return call_user_func($animation);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*
|
||||||
|
* @see DriverInterface::handleInput()
|
||||||
|
*/
|
||||||
public function handleInput(mixed $input): ImageInterface|ColorInterface
|
public function handleInput(mixed $input): ImageInterface|ColorInterface
|
||||||
{
|
{
|
||||||
return (new InputHandler())->handle($input);
|
return (new InputHandler())->handle($input);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*
|
||||||
|
* @see DriverInterface::colorProcessor()
|
||||||
|
*/
|
||||||
public function colorProcessor(ColorspaceInterface $colorspace): ColorProcessorInterface
|
public function colorProcessor(ColorspaceInterface $colorspace): ColorProcessorInterface
|
||||||
{
|
{
|
||||||
return new ColorProcessor($colorspace);
|
return new ColorProcessor($colorspace);
|
||||||
|
@@ -142,6 +142,18 @@ final class Image implements ImageInterface, Countable
|
|||||||
return $this->core->loops();
|
return $this->core->loops();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*
|
||||||
|
* @see ImageInterface::setLoops()
|
||||||
|
*/
|
||||||
|
public function setLoops(int $loops): ImageInterface
|
||||||
|
{
|
||||||
|
$this->core->setLoops($loops);
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritdoc}
|
* {@inheritdoc}
|
||||||
*
|
*
|
||||||
|
@@ -41,6 +41,11 @@ final class ImageManager
|
|||||||
return $this->driver->handleInput($input);
|
return $this->driver->handleInput($input);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function animate(callable $init): ImageInterface
|
||||||
|
{
|
||||||
|
return $this->driver->createAnimation($init);
|
||||||
|
}
|
||||||
|
|
||||||
private static function resolveDriver(string|DriverInterface $driver): DriverInterface
|
private static function resolveDriver(string|DriverInterface $driver): DriverInterface
|
||||||
{
|
{
|
||||||
if (is_object($driver)) {
|
if (is_object($driver)) {
|
||||||
|
@@ -59,4 +59,6 @@ interface CoreInterface extends Traversable
|
|||||||
* @return CoreInterface
|
* @return CoreInterface
|
||||||
*/
|
*/
|
||||||
public function setLoops(int $loops): CoreInterface;
|
public function setLoops(int $loops): CoreInterface;
|
||||||
|
|
||||||
|
public function first(): FrameInterface;
|
||||||
}
|
}
|
||||||
|
@@ -28,6 +28,14 @@ interface DriverInterface
|
|||||||
*/
|
*/
|
||||||
public function createImage(int $width, int $height): ImageInterface;
|
public function createImage(int $width, int $height): ImageInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create new animated image
|
||||||
|
*
|
||||||
|
* @param callable $init
|
||||||
|
* @return ImageInterface
|
||||||
|
*/
|
||||||
|
public function createAnimation(callable $init): ImageInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle given input by decoding it to ImageInterface or ColorInterface
|
* Handle given input by decoding it to ImageInterface or ColorInterface
|
||||||
*
|
*
|
||||||
|
@@ -94,6 +94,14 @@ interface ImageInterface extends IteratorAggregate, Countable
|
|||||||
*/
|
*/
|
||||||
public function loops(): int;
|
public function loops(): int;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set loop count of animated image
|
||||||
|
*
|
||||||
|
* @param int $loops
|
||||||
|
* @return ImageInterface
|
||||||
|
*/
|
||||||
|
public function setLoops(int $loops): ImageInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return exif data of current image
|
* Return exif data of current image
|
||||||
*
|
*
|
||||||
|
Reference in New Issue
Block a user