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