Оба драйвера, входящие в Intervention Image, по умолчанию поддерживают анимацию. Однако GD-драйвер должен использовать дополнительные ресурсы, так как он не поддерживает анимацию из коробки.
Если вы загружаете изображения без намерения обрабатывать анимацию, этот процесс можно предварительно отключить в Image Manager в конфигурации, чтобы сэкономить ресурсы.
#Создание анимаций
#Создание анимации из различных источников
Подробнее о процессе создания анимации можно узнать в разделе о создании экземпляра.
#Обнаружение анимаций
#Проверка текущего экземпляра изображения на анимацию
public Image::isAnimated(): bool
Возвращает true, если изображение анимировано. В противном случае — false.
#Пример
use Intervention\Image\ImageManager;
use Intervention\Image\Drivers\Gd\Driver;
// создать новый экземпляр менеджера с выбранным драйвером
$manager = new ImageManager(Driver::class);
// true
$result = $manager->read('images/animation.gif')->isAnimated();
#Редактирование анимаций
#Чтение количества кадров анимации
public Image::count(): int
Считывает количество кадров анимации. ImageInterface::class наследует Countable::class, поэтому объект изображения также можно использовать с функцией count().
#Пример
use Intervention\Image\ImageManager;
// создать новый экземпляр менеджера с выбранным драйвером
$manager = ImageManager::gd();
// прочитать анимированный gif
$image = $manager->read('images/animation.gif');
// получить количество кадров анимации
$count = $image->count();
// тот же результат с функцией count()
$count = count($image);
#Изменение кадров анимации
public Image::sliceAnimation(int $offset, null|int $length = null): ImageInterface
Извлекает кадры анимации на основе переданных значений и отбрасывает остальные. Параметр offset задаёт начальную точку новой анимации — все кадры до offset будут отброшены. Параметр length необязателен: он указывает, сколько кадров читать после offset. По умолчанию читаются все кадры до конца анимации.
#Параметры
| Имя | Тип | Описание |
|---|---|---|
| offset | integer | Начальная точка новой анимации |
| length | null or integer | Кадры для чтения после offset (необязательно) |
#Пример
use Intervention\Image\ImageManager;
use Intervention\Image\Drivers\Gd\Driver;
// создать новый экземпляр менеджера с выбранным драйвером
$manager = new ImageManager(new Driver());
// прочитать анимированный gif
$image = $manager->read('images/animation.gif');
// отбросить первые 20 кадров и прочитать следующие 10 кадров как новую анимацию
$image = $image->sliceAnimation(20, 10);
#Чтение количества итераций анимации
public Image::loops(): int
Считывает количество итераций анимированного изображения. Значение 0 означает, что изображение зациклено (воспроизводится непрерывно).
#Пример
use Intervention\Image\ImageManager;
use Intervention\Image\Drivers\Imagick\Driver;
// создать новый экземпляр менеджера с выбранным драйвером
$manager = new ImageManager(new Driver());
// прочитать анимированный gif
$image = $manager->read('images/animation.gif');
// вернуть количество повторов анимации
$count = $image->loops();
#Изменение количества итераций анимации
public Image::setLoops(int $count): ImageInterface
Изменяет количество повторов анимации. Установите 0, чтобы цикл был бесконечным.
#Параметры
| Имя | Тип | Описание |
|---|---|---|
| count | integer | Количество итераций анимации |
#Пример
use Intervention\Image\ImageManager;
use Intervention\Image\Drivers\Gd\Driver;
// создать новый экземпляр менеджера с выбранным драйвером
$manager = new ImageManager(new Driver());
// прочитать анимированный gif
$image = $manager->read('images/animation.gif');
// анимация должна проиграться только один раз
$image = $image->setLoops(1);
#Удаление анимации
public Image::removeAnimation(int|string $position = 0): ImageInterface
Преобразует анимированное изображение в неанимированное, отбрасывая все кадры текущего экземпляра изображения кроме кадра на указанной позиции.
Позиция может быть указана как целым числом, так и строкой. В случае целого числа используется точный номер кадра, начиная с 0, который останется. Строковые значения должны быть процентом между 0% и 100%, при этом номер оставшегося кадра определяется приблизительно.
Если позиция указана целым числом, метод выбрасывает исключение, если кадр не существует. При использовании процентных значений этого не происходит, поскольку всегда можно найти соответствующий кадр.
#Параметры
| Имя | Тип | Описание |
|---|---|---|
| position | integer or string | Позиция кадра, который останется. |
#Пример
use Intervention\Image\ImageManager;
use Intervention\Image\Drivers\Gd\Driver;
// создать новый экземпляр менеджера с выбранным драйвером
$manager = new ImageManager(new Driver());
// прочитать анимированный gif
$image = $manager->read('images/animation.gif');
// Преобразовать анимацию в статическое изображение, показывающее кадр на позиции 5
$image = $image->removeAnimation(5);
// сделать то же самое, выбрав кадр анимации на 25% от всей длины
$image = $image->removeAnimation('25%');