Imagick: удалить кадры из анимированного GIF?

Я пытаюсь понять, как удалить фреймы из анимированного GIF.

В настоящее время я пытаюсь это сделать (как тест):

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

Однако это похоже на тост всего в объекте.

Предложения от товарищей по работе заключались в том, чтобы просто создать еще один объект IM и извлечь в него славу и т. Д. Однако это кажется очень грязным.

Некоторое время я просматривал документацию Imagick и пробовал пару вещей … Но мне тоже не удалось сделать то, что вы хотите – так что мы, по крайней мере, два, которые не могут узнать чистый способ ^^

Во всяком случае, единственный способ, которым мне удалось удалить фрейм для анимированного GIF-изображения, – это создать новый, содержащий только те кадры, которые я не хотел удалять 🙁

Учитывая, что я загрузил изображение таким образом:

 // Load the existing image $image = new Imagick(dirname(__FILE__) . '/animated-gif-source.gif'); 

(Это анимированный gif с 3 кадрами, я хочу «удалить» второй).

Как я уже сказал, единственный способ, которым я нашел «удалить фрейм», – это один:

 $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); 

Каждый из этих выходов содержит только первый и третий кадры; поэтому он работает …
Но, как вы сказали, это не очень хорошо 🙁

Я думаю, что это, вероятно, будет отлично работать для большинства изображений; вы можете столкнуться с проблемами с большими изображениями, но анимированные GIF-файлы, как правило, не такие большие … не так ли?

Другим способом может быть использование преобразования из командной строки … Но … не так уж и здорово, и я не нашел способ просто удалить фрейм с ними 🙁

Я использовал только служебные программы командной строки для IM.

convert srcImage.gif [0] dstImage.gif

Должен сделать трюк, если я не забуду вариант.

[0] ссылается на первый кадр анимированного gif.