Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Ресайз анимированных GIF картинок с поддержкой PHP GD

Anna | 31.05.2014 | нет комментариев

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

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

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

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

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

Разбор конструкции и обзор всякого бита я исполнял вручную и не прибегал к функциям обзора графического файла библиотеки GD которая в своей природе достаточно глюковатая. Она (библиотека GD) подключалась только для ресайза отдельного фрейма. С применением библиотеки GD для ресайза единичного фрейма связан один глюк (обыкновенно 1 на 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);

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

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

Ну и последнее примечание и ссылка на класс: в классе всецело отсутствует форматирование кода, это связано как с оптимизацией размера самого файла так и с тезисом «пользователь не должен знать внутреннюю конструкцию, только открытые функции», а кто хочет модернизировать либо дополнить класс без задач отформатирует так как ему нужно.

класс GIF_eXG (PhpClasses)

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB