2012-09-23 30 views
8

che cerco da molto tempo come estrarre fotogrammi da una GIF animata con PHP ... unfortunaly Ho appena trovato come ottenere la loro durata ...Come estrarre fotogrammi di una GIF animata con PHP

davvero è necessario estrarre i frame GIF e la loro durata per applicare alcuni ridimensiona, ruotare, ecc, su ciascuno e quindi per rigenerare la GIF con fotogrammi modificati!

Non voglio usare alcun software, libreria esterna (come ImageMagick), solo PHP: infatti devo consentire alla mia classe http://phpimageworkshop.com/ di lavorare con GIF animate.

Se hai qualche idea, ti sto ascoltando ^^!

+0

con il set di restrizioni, non si può. –

+2

Come potete vedere, trovo una classe che ridimensiona ogni frame solo con PHP: https://gist.github.com/3769812 Quindi questo è possibile ma la classe non è ben documentata. Controllerò e capirò tutte queste righe se nessuno ha una soluzione più semplice: s – Sybio

risposta

1

Non voglio usare qualsiasi software, libreria esterna (come ImageMagick)

Beh, buona fortuna, perché il 90% delle funzionalità delle esportazioni del motore Zend per il runtime di PHP viene dalle biblioteche

Se avete qualche idea, vi sto ascoltando ^^!

Analizzare i dati binari nel formato GIF. Potresti usare unpack(), tra le altre cose.

+0

Come utilizzeresti la decompressione per scomporre i fotogrammi di una gif animata? –

+0

La mia risposta menziona "tra le altre cose" come normali costrutti di programmazione, cicli, condizioni. Non "unpack()" è la parola chiave lì, ma ** parse **. – Flavius

+1

Concordato che l'analisi è la chiave qui. Semplicemente non sembra 'unpack()' è un modo valido per ottenere frame gif animati, almeno da quello che posso dire osservando i formati supportati.http://php.net/manual/en/function.pack.php –

3

Beh, in realtà non consiglio di farlo in questo modo, ma ecco un'opzione. Le gif animate sono in realtà solo un numero di gif concatenate insieme da un separatore "\ x00 \ x21 \ xF9 \ x04". Sapendo questo, devi semplicemente trascinare l'immagine in PHP come una stringa, eseguire un'esplosione e scorrere l'array che esegue la trasformazione. Il codice potrebbe essere simile a questo.

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

io non sono sicuro al 100% delle specificità di ri-concatenamento, l'immagine, ma ecco il wikipedia page regarding the file format of animated GIFs.

+0

Ho provato la tua soluzione ma non funziona :(Grazie comunque ^^ – Sybio

2

Io sono l'autore della libreria https://github.com/stil/gif-endec, che è significativamente più veloce (circa 2,5 volte) nella decodifica delle GIF rispetto alla libreria Sybio/GifFrameExtractor della risposta accettata. Ha anche un minor utilizzo di memoria, perché consente di elaborare un frame dopo l'altro al momento della decodifica, senza caricare tutto in memoria contemporaneamente.

Piccolo esempio di codice:

<?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" 
    ); 
}); 
Problemi correlati