/* Если использовать GD, то вы заметите, что ресайза анимашки
как такового не выйдет, будет изменен лишь первый кадр.
На помощь приходит ImageMagick (http://www.imagemagick.org/)
В мануале http://www.php.net/manual/en/imagick.examples-1.php приведен пример
(смотрите Example #5 Read in GIF image and resize all frames), который делает
косячные анимашки, поэтому привожу рецепт, который работает.
*/
//большая анимашка big.gif
$images = new Imagick('big.gif');
//вычисляем масштаб сторон (хотим сделать с максимальной стороной 64)
$scale = max($images->getImageWidth(), $images->getImageHeight()) / 64;
//вот этой фишки не хватает в примере из мануала на php.net
$images = $images->coalesceImages();
//вычисляем рамеры сторон с учетом масштаба
$width = round($images->getImageWidth() / $scale);
$height = round($images->getImageHeight() / $scale);
//и ресайзим каждый кадр в цикле
do {
$images->scaleImage($width, $height);
} while ($images->nextImage());
//освобождаем память
$images = $images->deconstructImages();
//сохраняем анимацию в small.gif
$images->writeImages('small.gif', true);
/*
В результате получаем нормальную отресайзенную анимацию.
Но если попытаться сделать пакетную обработку нескольких анимашек, то
можно убедиться, что скрипт делает это ОЧЕЕЕЕЕНЬ ДОЛГО, поэтому для
пакетной обработки лучше применять вызов команды
*/
exec("/usr/local/bin/convert 'big.gif' -coalesce -thumbnail '64x64>' \
-layers Optimize 'small.gif' ");
/**
Что же делать, если нет ImageMagick на хостинге?
Для экстремалов есть классы для работы с gif-анимациями, если хотите, можете
писать о них в комментах, лично у меня такого желания нет.
*/