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 パラメータは新しいアニメーションの開始位置を設定するために使えます。オフセットより前のフレームはすべて破棄されます。length パラメータは省略可能で、オフセットの後に読み取るフレーム数を指定します。デフォルトではアニメーションの末尾までのすべてのフレームを読み取ります。
#パラメータ
| Name | Type | 説明 |
|---|---|---|
| offset | integer | 新しいアニメーションの開始位置 |
| length | null or integer | オフセットの後に読み取るフレーム数(省略可) |
#例
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 に設定すると継続的にループします。
#パラメータ
| Name | Type | 説明 |
|---|---|---|
| count | integer | アニメーションの反復回数 |
#例
use Intervention\Image\ImageManager;
use Intervention\Image\Drivers\Gd\Driver;
// 希望するドライバーで新しいマネージャーインスタンスを作成
$manager = new ImageManager(new Driver());
// アニメーションGIFを読み込む
$image = $manager->read('images/animation.gif');
// アニメーションを1回だけ実行する
$image = $image->setLoops(1);
#アニメーションを削除する
public Image::removeAnimation(int|string $position = 0): ImageInterface
指定した位置のフレームだけを残し、それ以外のフレームを破棄してアニメーション画像を静止画像にします。
position は整数または文字列で指定できます。整数の場合は 0 から始まる正確なフレーム番号が残るフレームとして使われます。文字列値は 0% から 100% のパーセンテージで指定する必要があり、残るフレーム番号は概算で決まります。
position を整数で指定した場合、指定したフレームが存在しなければ例外が投げられます。パーセンテージ指定では常にフレームが見つかるためこの制約はありません。
#パラメータ
| Name | Type | 説明 |
|---|---|---|
| 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%');