Ресайз (resize) gif анимации

<?php
/**
* Ресайз (resize) gif анимации
* автор: Nc_Soft
* 08.02.10
*/

/* Если использовать 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->optimizeImageLayers();

//освобождаем память
$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-анимациями, если хотите, можете
писать о них в комментах, лично у меня такого желания нет.
*/