Pull to refresh

Ресайз анимированных GIF картинок с помощью PHP + GD

Reading time3 min
Views9.1K
Доброго времени суток.

Сперва небольшое вступление.
Во время разработки своего собственного проекта я столкнулся с задачей ресайза GIF файлов исключительно средствами PHP без использования программного пакета ImageMagick (думаю сами догадались почему). Если есть задача значить ее надо решить, не придав ей большого внимания и сложности я пошел на просторы Интернета искать реализованный скрипт в виде функции или класса. И к своему удивлению и огорчению (так как ресайз должен быть однозначно) я нашел всего два скрипта на PHP, авторы которых сделали попытку реализовать эту нетривиальную задачу (о других языках я вообще молчу там только безальтернативный ImageMagick), хоть перерыл Интернет вдоль и поперек.

— первый скрипт: попытка два класса GIFDecoder.class.php и GIFEncoder.class.php, которые применялись для генерации GIF анимации, научить ресайзить GIF изображения; в результате конечному пользователю приходится писать чуть ли не третий класс для работы с данными, и судя по отзывам удается только половине; но и это не главное, а главное то что ресайз многих файлов получается некорректным (проблемы с прозрачностью, чередованием, обработкой кадров и тд), этих файлов достаточно много, и поэтому не подходит для поставленной задачи, ссылка на страницу автора

— второй скрипт: класс gifresizer.php — это уже более цельный, специализированный и проще в использовании, и считается лучшим на сегодняшний день в Интернете, но мои эксперименты с ним показали что у этого класса проблемы с обработкой файлов GIF у которых оптимизация графических данных, а также некорректная работа с палитрой, а самое страшное что от некоторых GIF файлов скрипт уходит в бесконечный цикл, о чем правда честно пишет сам автор ссылка на страницу класса

Из перечисленных выше причин ни один класс естественно не подошел. Что же делать?!!! Немного поразмыслив, закатав рукава и отложив на некоторое время основной проект я решил реализовать нереализованное, а именно класс для полноценного и главное корректного ресайза GIF файлов. Рассказывать долго не буду скажу лишь одно, задача была действительно нетривиальной сложности, а все из за того что мудреная структура GIF файла хоть и стандартизованная но стандарт мало кто соблюдает, точнее здесь как стандарт не соответствие стандарту.

В процессе разработки код был переписан три раза (иногда были мысли закинуть это неблагодарное дело), а в результате появился класс для ресайза анимированных GIF файлов с поддержкой прозрачности GIF_eXG. Отличительной особенностью класса является: быстрая, стабильная и корректная работа, а также простота в использовании. Более того класс перебирает (читать: исправляет ошибки) исходный файл дабы тот хоть приблизительно соответствовал стандарту, как результат в ОС Windows в файле где были проблемы с воспроизведением анимации (в данной ОС) после ресайза анимация воспроизводится корректно.

Разбор структуры и анализ каждого бита я выполнял вручную и не прибегал к функциям анализа графического файла библиотеки GD которая в своей природе довольно глюковатая. Она (библиотека GD) подключалась только для ресайза отдельного фрейма. С использованием библиотеки GD для ресайза единичного фрейма связан один глюк (обычно 1 на 50-70 ресайзов) который представляет собой небольшие графические артефакты в виде разбросанных пикселей.

Пример использования класса:

require_once «gif_exg.php»;

$nGif = new GIF_eXG("../image/src.gif",1);
$nGif->resize("../image/dst1.gif",180,180,1,0);
$nGif->resize("../image/dst2.gif",150,150,0,0);

я думаю и так все понятно, лишь небольшие замечания по передаваемым параметрам:
— в конструкторе второй параметр отвечает за оптимизацию структуры, если (1) то выходной файл более компактен по размеру, если (0) то сохранится вся исходная структура;
— в единственной открытой функции resize четвертый параметр указывает соблюдать ли симметрию (1), или не соблюдать (0);
— пятый параметр экспериментальный: (1) попытаться интерполировать пикселы, (0) без интерполяции (рекомендуется);

Место применения класса: создание анимированных аватаров, превю, галерей изображений и тп.

В файле присутствует инструкция на ломаном английском (за нее наперед извиняюсь, проблемы с ин. языками ) для интернационального сообщества, думаю разберетесь.

Ссылки на класс (текущая версия 1.07):

класс GIF_eXG (PhpClasses)
класс GIF_eXG (GitHub)
Tags:
Hubs:
Total votes 18: ↑9 and ↓90
Comments42

Articles