7

アニメーション GIF からフレームを削除する方法を理解しようとしています。

現在、私はこれを試しています(テストとして):

$count = 1;
foreach ($_im AS $frame) {
    if ($count > 1) { $frame->removeImage(); }
    $count++;        
}

ただし、これはオブジェクト内のすべてを乾杯するようです。

同僚からの提案は、別の IM オブジェクトを作成し、そこに名声を抽出するなどです。しかし、それは非常に面倒です。

4

2 に答える 2

6

私は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 は一般的にそれほど大きくありません


他の方法は、コマンドラインから変換を使用することかもしれません...しかし...それほど素晴らしいものではなく、それらのいずれかでフレームを削除する方法が見つかりませんでした:-(

于 2009-08-01T14:31:04.197 に答える
2

IM にはコマンド ライン ユーティリティしか使用していません。

srcImage.gif[0] dstImage.gif を変換します

オプションを忘れない限り、トリックを行う必要があります。

[0] は、アニメーション gif の最初のフレームを指します。

于 2009-07-29T08:39:40.257 に答える