Как извлечь фреймы анимированного GIF с помощью PHP

Я долго искал, как извлекать кадры из анимированного GIF с PHP … к сожалению, я просто нашел, как получить их продолжительность …

Мне действительно нужно извлечь кадры GIF и их продолжительность, чтобы применить некоторые изменения размера, поворота и т. Д. Для каждого, а затем для регенерации GIF с отредактированными кадрами!

Я не хочу использовать какое-либо программное обеспечение, внешнюю библиотеку (например, ImageMagick), просто PHP: на самом деле мне нужно разрешить моему классу http://phpimageworkshop.com/ работать с анимированным GIF.

Если у вас есть идеи, я вас слушаю ^^!

Я потратил свой день на создание класса, основанного на этом, чтобы достичь того, что я хотел использовать только PHP!

Вы можете найти его здесь: https://github.com/Sybio/GifFrameExtractor

Спасибо за ваши ответы!

Ну, я действительно не рекомендую это делать, но вот вариант. Анимированные gifs на самом деле представляют собой всего лишь несколько gifs, объединенных вместе разделителем: \ x00 \ x21 \ xF9 \ x04. Зная это, вы просто рисуете изображение на PHP как строку, запускаете взорвать и зацикливаете массив, в котором выполняется ваше преобразование. Код может выглядеть примерно так.

$image_string = file_get_contents($image_path); $images = explode("\x00\x21\xF9\x04", $image_string); foreach( $images as $image ) { // apply transformation } $new_gif = implode("\x00\x21\xF9\x04", $images); 

Я не на 100% уверен в специфике повторного конкатенации изображения, но вот страница wikipedia относительно формата файла анимированных GIF .

Я являюсь автором библиотеки https://github.com/stil/gif-endec , которая значительно быстрее (примерно в 2,5 раза) при декодировании GIF, чем библиотека Sybio/GifFrameExtractor из принятого ответа. У него также меньше использования памяти, так как он позволяет обрабатывать один кадр за другим во время декодирования, не загружая сразу все в память.

Пример небольшого кода:

 <?php require __DIR__ . '/../vendor/autoload.php'; use GIFEndec\Events\FrameDecodedEvent; use GIFEndec\IO\FileStream; use GIFEndec\Decoder; /** * Open GIF as FileStream */ $gifStream = new FileStream("path/to/animation.gif"); /** * Create Decoder instance from MemoryStream */ $gifDecoder = new Decoder($gifStream); /** * Run decoder. Pass callback function to process decoded Frames when they're ready. */ $gifDecoder->decode(function (FrameDecodedEvent $event) { /** * Write frame images to directory */ $event->decodedFrame->getStream()->copyContentsToFile( __DIR__ . "/frames/frame{$event->frameIndex}.gif" ); }); 

Я не хочу использовать какое-либо программное обеспечение, внешнюю библиотеку (например, ImageMagick)

Ну, удачи в этом, потому что 90% функциональности, которую Zend Engine экспортирует в среду выполнения PHP, поступает из библиотек.

Если у вас есть идеи, я вас слушаю ^^!

Разбирайте двоичные данные в формате GIF. Вы можете использовать unpack (), между прочим.