Изменение размера анимированного файла GIF без разрушения анимации - PullRequest
45 голосов
/ 05 апреля 2009

Мне нужно изменить размер анимированного GIF-файла, не разрушая анимацию.

Как я могу сделать это с помощью PHP?

Ответы [ 13 ]

58 голосов
/ 05 апреля 2009

если у вас есть доступ к imagemagick, вы можете сделать это:

system("convert big.gif -coalesce coalesce.gif");
system("convert -size 200x100 coalesce.gif -resize 200x10 small.gif");

это наиболее вероятно с плагином imagemagick, если у вас нет доступа к system ()

ПРИМЕЧАНИЕ: это может создать больший размер файла, хотя изображение меньших размеров из-за слияния, по существу, деоптимизации изображения.

UPDATE: Если у вас нет доступа к ImageMagick, вы можете использовать комбинацию из следующих шагов для изменения размера анимированного GIF (при условии, что у вас есть доступ к GD):

  1. Определить, является ли изображение анимированным GIF: Можно ли обнаружить анимированные GIF-файлы с помощью php и gd? (топ-ответ)
  2. Разделить анимированный GIF на отдельные кадры: http://www.phpclasses.org/package/3234-PHP-Split-GIF-animations-into-multiple-images.html
  3. Изменение размера отдельных кадров: http://www.akemapa.com/2008/07/10/php-gd-resize-transparent-image-png-gif/
  4. Снова перекомпоновать кадры в анимированный GIF: http://www.phpclasses.org/package/3163-PHP-Generate-GIF-animations-from-a-set-of-GIF-images.html

Это определенно намного интенсивнее, чем маршрут ImageMagick, но это должно быть технически возможно.

Если у вас получится, поделитесь с миром!

11 голосов
/ 28 августа 2013

Попробуйте GDEnhancer (используйте ImageCraft ). Для этого нужна только библиотека GD, и она сохраняет анимацию GIF

11 голосов
/ 05 апреля 2009

Вам нужно будет разложить gif на кадры, миниатюру и собрать заново.

Посмотрите ImageMagick и этот урок .

4 голосов
/ 13 марта 2013

Я пробовал многочисленные примеры изменения размера анимированных GIF-файлов с помощью PHP-модуля Imagick, но ни один из них не помог мне Затем, после некоторого времени отладки, я обнаружил реальную проблему: анимация была потеряна при сохранении изображения на диск, $animation->writeImage($file_dst); или $animation->writeImages($file_dst, true);

Я изменил это на file_put_contents($file_dst, $animation->getImagesBlob()); и большинство примеров сразу начали работать.

Надеюсь, это кому-нибудь поможет.

4 голосов
/ 22 февраля 2012

Пример на http://www.php.net/manual/en/imagick.coalesceimages.php изменит размер вашего GIF при сохранении времени кадра. Что-то, что большинство других примеров не делают.

Другие примеры Перестройка GIF, в то время как этот позволяет изменять рамки изображения.

3 голосов
/ 20 апреля 2015

Если у вас установлен ImageMagick, вы можете использовать один вызов для convert:

system("convert big.gif -coalesce -repage 0x0 -resize 200x100 -layers Optimize small.gif");
2 голосов
/ 22 марта 2011

Я думаю, что у меня есть это в сумке.

Это решение ни в коем случае не является идеальным и содержит некоторую грубую силу здесь и там, но я смог добавить свой сценарий изменения размера изображений на основе GD / PHP с достаточной функциональностью для поддержки анимации.

Решение в значительной степени основано на превосходных бесплатных библиотеках от László Zsidi - http://www.phpclasses.org/browse/author/283569.html

Вы можете ознакомиться с краткой демонстрацией и загрузить исходники с http://forssto.com/gifexample/ (прямая ссылка: http://forssto.com/gifexample/gifanimresize.zip)

ИЗВЕСТНЫЕ ПРОБЛЕМЫ:

  • Поддержка прозрачности - это будет легко добавить к этому решению, но так как у меня нет срочной необходимости это, я останавливаюсь здесь.

  • Частота кадров - по неизвестной причине класс GifEncoder не может взять с учетом частоты кадров указано. Мне нужно посмотреть в это позже.

  • Я нашел один GIF-файл из моего набора тестов, которые как-то имели разные размеры кадров в нем и этой анимации не удалось правильно работать. Еще некоторые отладка, чтобы сделать то.

1 голос
/ 28 февраля 2015

GIF Animation Resizer - простой одноклассный инструмент, который справится с задачей.

Примечание: Используется временная папка для записи отдельных кадров. Хотя это временные метки для фреймов, вам может потребоваться создать уникальную папку, если вы собираетесь использовать ее на сервере, где несколько пользователей будут одновременно изменять размеры GIF.

1 голос
/ 11 марта 2012

Если у вас нет Imagemagick на вашем сервере, вы можете попробовать это:

http://www.phpclasses.org/package/7353-PHP-Resize-animations-in-files-of-the-GIF-format.html

Класс изменяет размер анимации GIF с помощью GD. Сначала анализирует кадры, затем изменяет их размер, после чего снова компилирует их в один файл без потери времени задержки, методов удаления, таблиц цветов и т. Д.

Попробуйте, и если вы обнаружите ошибку или хотите предложить какие-то оптимизации и т. Д., Вы можете использовать форум класса или оставить комментарий на странице моего сайта. И я отвечу как можно скорее.

1 голос
/ 24 сентября 2011

Это все ответы, кроме корыта ImageMagick не работает для меня. Сценарии в ответах до этого все полны ошибок.

Даже установкой ImageMagick было сложно управлять, так что вот мой опыт.

Вот , как установить ImageMagick на Windows 7 и xampp 1.7.4.
Примечание : выберите 64 бит (для win7) и при установке оставьте отмеченным параметр «Добавить в системный путь».

А затем следуйте: http://www.creativearmory.com/tutorials/resize-animated-gifs-with-php-and-imagemagick

Я потерял часы на сценариях в этих сообщениях, и ImageMagick и этот учебник были успешными за считанные минуты.

И еще одно замечание: на моем веб-сервере по умолчанию установлен ImageMagick, так что, думаю, на большинстве серверов он тоже есть.

...