Как изменить размер анимации GIF средствами PHP и IMAGICK? На многих форумах Рунета задают подобные вопросы. Но ответа на них нет почти нигде. Много предложений, поступает от более продвинутых в PHP пользователей, как можно изменить размер анимации GIF. Но в основном - это не уверенные советы "наверно так...", "может так? ..." и тому подобные. Еще предлагаются найденные в сети длинные php-коды, с кучей лишних функций и примочек, которые работают не корректно или не работают вовсе.
На самом деле все гораздо проще!
Итак, приступим непосредственно к ответу на вопрос: "как изменить размер анимации GIF средствами PHP и IMAGICK?". Объект IMAGICK, содержащий анимацию, представляет собой массив, значения которого содержат по одному кадру. Для того чтобы изменить анимированный GIF средствами PHP и IMAGICK, нужно просто перебрать в цикле объект IMAGICK, и изменить размер каждого кадра. Удобнее всего это делать в цикле "foreach".
Вот простой пример скрипта, который создает превьюшку (с кадрированием лишних краев) и выводит ее в браузер:
// максимальная ширина кадра
$max_animation_width = 128;
// максимальная высота кадра
$max_animation_height = 128;
// создаем объект из существующей анимации GIF
$animation_source = new Imagick('animation.gif');
// узнаем формат анимации
$animation_format = $animation_source->getImageFormat();
// в цикле перебираем объект по кадрам
foreach($animation_source as $imagick_frame)
{
// меняем размер текущего кадра с обрезанием краев
$imagick_frame->cropThumbnailImage($max_animation_width, $max_animation_height);
} //end foreach($animation_source as $imagick_frame)
// отправляем заголовок
header('Content-Type: image/'.$animation_format);
// выводим измененную анимацию
echo $animation_source->getImagesBlob();
// удаляем объект, чтобы не засорять буфер
$animation_source->destroy();
Вот такой маленький php-скрипт легко меняет размер анимации GIF.
Конечно, IMAGICK располагает огромным количеством разных функций и фильтров, с помощью, которых можно сделать с анимацией практически все, что душе угодно, но это уже "другая история".
If my problem was a Death Star, this article is a photon torpedo.