avatar

Загадка века - imagick не сохраняет gif анимацию

Опубликовал в личный блог
+2
анимация работает
Недавно столкнулся с проблемой, которая поставила меня в полное затупление:) Коротко суть проблемы: Есть набирающая популярность перспективная CMS — altocms Поставил бету версию на два разных хостинга — один на digitalocean, второй на fastvps. На DO gif анимация работает, грузится в профиль, отображается корректно в топике и в фотосетах. На fastvps — черта с два. Разница в хостингах не очень большая, на DO PHP Version 5.5.9-1ubuntu4.5 на fastvps — PHP Version 5.4.39-0+deb7u2
Версии imagemagick одинаковые. Главное простые тестовые скрипты с использованием обработки gif файлов проходят и на одном и на другом сайтах.
Вот примеры:
test.php
<?php

error_reporting(E_ALL);
ini_set('display_errors', 1);

$image = new Imagick(__DIR__ . "/i1.gif");
/* Notice writeImages instead of writeImage */
$image->writeImages(__DIR__ . "/i2.gif", true);

?>
<img src="i2.gif">


test_2.php

<?php
 $im = new imagick( 'i1.gif' );
// изменяем размер сохраняя пропорции
$im->thumbnailImage( 300, 0);
// сохраняем изменения
$im->writeImage( 'a_thumbnail.gif' );


 ?>

 <img src="a_thumbnail.gif">


test_3.php

<?php
 
 
$im = new Imagick(__DIR__ . "/i1.gif");  // Берем исходный файл
$draw = new ImagickDraw();
$draw->setFont( "fonts/Action_Man.ttf" ); // выбираем шрифт
$draw->setFontSize(12);
$draw->setFillColor('black');
 
foreach ($im as $frame) {
    $frame->annotateImage( $draw, 2, 92, 0, 'OHAYO!' ); // Наносим текст
}    
 
$im->writeImages('pic_out.gif',true); // Сохраняем анимацию
$im->destroy();
?>


test_4.php

<?php

/* Создание нового объекта imagick и чтение в GIF */
$im = new Imagick("i1.gif");

/* Изменение размера всех фреймов */
foreach ($im as $frame) {
    /* фреймы 50x50 */
    $frame->thumbnailImage(500, 500);

    /* Устанавливаем виртуальный холст для коррекции размера */
    $frame->setImagePage(500, 500, 0, 0);
}

/* Обратите внимание, writeImages вместо writeImage */
$im->writeImages("example_small.gif", true);
?>

<img src="example_small.gif">


test_5.php

<?php
/* create new imagick object */
$image = new Imagick(__DIR__ . "/i1.gif");

/* optimize the image layers */
$image->optimizeImageLayers();

/* write the image back */
$image->writeImages(__DIR__ . "/i2_optimize.gif", true);
?>

<img src="i2_optimize.gif">


test_6.php

<?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('i1.gif');
 
//вычисляем масштаб сторон (хотим сделать с максимальной стороной 64)
$scale  = max($images->getImageWidth(), $images->getImageHeight()) / 222;
 
//вот этой фишки не хватает в примере из мануала на 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('mysmall.gif', true);
?>

<img src="mysmall.gif">
 


Теперь проверяем:

Сначала на сервере DO:

investb.ru/test/test.php
investb.ru/test/test_2.php
investb.ru/test/test_3.php
investb.ru/test/test_4.php
investb.ru/test/test_5.php
investb.ru/test/test_6.php

Все прекрасно обрабатывается.

На fastvps:

youwo.ru/test/test.php
youwo.ru/test/test_2.php
youwo.ru/test/test_3.php
youwo.ru/test/test_4.php
youwo.ru/test/test_5.php
youwo.ru/test/test_6.php

Тоже все прекрасно обрабатывается…

Но почему картинки в профиле, в топиках и фотосете на DO выглядят так:

анимация работает

А на fastvps картинки выглядят так:

Нихуя не работает gif анимация

Или при загрузке в фотосет даже вот так:

gif не работает

Что то на ум ничего не идет… Может связки apache+nginx по разному настроены… Что может быть и куда копать люди?
2 комментария RSS
avatar
Значит где то в движке пережимает гифку или сохраняет только первый кадр… Только непонятно почему на другом сервере все работает… Может все таки разница в версиях php? Просто ничто другое на ум не приходит…
avatar
Тоже обращал внимание на такую проблему. И заметил, что GIF корректно загружается, если загружать его с другого сервера по ссылке. А если со своего компьютера через POST, то анимация пропадает.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.