2012-09-23 43 views
8

que busco desde hace mucho tiempo cómo extraer fotogramas de un GIF animado con PHP ... unfortunaly me acaba de encontrar la manera de conseguir su duración ...Cómo extraer fotogramas de una animación GIF con PHP

Realmente necesita extraer los marcos GIF y su duración para aplicar algunos cambios de tamaño, rotar, etc. en cada uno y luego regenerar el GIF con marcos editados.

No quiero usar ningún software, biblioteca externa (como ImageMagick), solo PHP: de hecho, necesito permitir que mi clase http://phpimageworkshop.com/ trabaje con GIF animado.

Si tienes alguna idea, te estoy escuchando ^^!

+0

con su conjunto de restricciones, no se puede. –

+2

Como puede ver, encuentro una clase que cambia el tamaño de cada cuadro solo con PHP: https://gist.github.com/3769812 Así que esto es posible, pero la clase no está bien documentada. Comprobaré y entenderé todas estas líneas si nadie tiene una solución más simple: s – Sybio

Respuesta

1

no quiero utilizar cualquier software, biblioteca externa (como ImageMagick)

Bueno, buena suerte con eso, porque el 90% de la funcionalidad de las exportaciones del motor Zend a las librerías de PHP viene de las bibliotecas.

Si tienes alguna idea, te estoy escuchando ^^!

Analice los datos binarios en el formato GIF. Podría usar unpack(), entre otras cosas.

+0

¿Cómo usarías desempaquetar para romper los marcos de un gif animado? –

+0

Mi respuesta menciona "entre otras cosas" como construcciones de programación, bucles, condiciones. No "unpack()" es la palabra clave allí, pero ** parse **. – Flavius

+1

De acuerdo en que el análisis es la clave aquí. Simplemente no parece que 'unpack()' sea una forma viable de obtener marcos gif animados, al menos de lo que puedo decir mirando en los formatos que admite.http://php.net/manual/en/function.pack.php –

3

Bueno, realmente no recomiendo hacerlo de esta manera, pero aquí hay una opción. Los gifs animados son en realidad solo un número de gifs concatenados por un separador, "\ x00 \ x21 \ xF9 \ x04". Sabiendo eso, simplemente tira de la imagen en PHP como una cadena, ejecuta una explosión, y recorre la matriz que ejecuta tu transformación. El código podría verse más o menos así.

$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); 

no estoy 100% seguro de los detalles de la re-concatenación, la imagen, pero aquí está el wikipedia page regarding the file format of animated GIFs.

+0

Intenté su solución pero no funciona :(Gracias de todos modos ^^ – Sybio

2

Soy el autor de la biblioteca https://github.com/stil/gif-endec, que es significativamente más rápido (aproximadamente 2.5 veces) en la decodificación de archivos GIF que en la biblioteca Sybio/GifFrameExtractor de la respuesta aceptada. También tiene menos uso de memoria, porque le permite procesar un fotograma tras otro en el momento de la decodificación, sin cargar todo en la memoria a la vez.

Pequeño ejemplo de código:

<?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" 
    ); 
}); 
Cuestiones relacionadas