Я пытаюсь понять, как удалить фреймы из анимированного 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.