私はImagick
しばらくドキュメントを読んでいて、いくつかのことを試しました...しかし、私はあなたが望むこともできませんでした.さすが^^
とにかく、アニメーションGIF画像のフレームを削除する唯一の方法は、削除したくないフレームのみを含む新しい画像を作成することでした:-(
この方法で画像をロードしたことを考えると:
// Load the existing image
$image = new Imagick(dirname(__FILE__) . '/animated-gif-source.gif');
(これは 3 フレームのアニメーション gif です。2 番目のフレームを「削除」したい)。
私が言ったように、「フレームを削除する」ことがわかった唯一の方法はこれです:
$new_image = new Imagick();
$i = 1;
foreach ($image as $frame) {
if ($i===1 || $i===3) {
// 3 frames ; we keep the first and third one
// ie, remove the second one
$new_image->addImage($frame->getImage());
}
$i++;
}
そう :
- 新しい画像を作成する
- 元のフレームの繰り返し処理
- 現在のフレームを保持したい場合は、それを新しい画像にコピーします
そして最後に、画像をブラウザに出力するには:
// To directly output to the browser
header('Content-Type: image/gif');
echo $new_image->getImagesBlob();
または、ファイルに書き込むには:
// To write the new image to a file
// Must use writeImages, and not writeImage (multi-frames ! )
$new_image->writeImages(dirname(__FILE__) . '/animated-gif-output.gif', true);
これらの出力のそれぞれには、最初と 3 番目のフレームのみが含まれます。だから、それは働いています...
しかし、あなたが言ったように、それは気分が良くありません:-(
おそらくほとんどの画像で問題なく機能すると思います。大きな画像では問題が発生する可能性がありますが、アニメーション GIF は一般的にそれほど大きくありません。
他の方法は、コマンドラインから変換を使用することかもしれません...しかし...それほど素晴らしいものではなく、それらのいずれかでフレームを削除する方法が見つかりませんでした:-(