2012-09-23 12 views
8

ich für eine lange Zeit zu suchen, wie Bilder aus einem animierten GIF mit PHP zu extrahieren ... unfortunaly Ich fand nur, wie ihre Dauer erhalten ...Wie Rahmen eines animierten GIF extrahieren mit PHP

ich wirklich müssen die GIF-Frames und ihre Dauer extrahieren, um etwas Größenänderung vorzunehmen, rotieren usw., und dann das GIF mit editierten Frames neu zu generieren!

Ich möchte keine Software, externe Bibliothek (wie ImageMagick), nur PHP: in der Tat muss ich meine Klasse http://phpimageworkshop.com/ mit animierten GIF arbeiten.

Wenn Sie eine Idee haben, höre ich Ihnen ^^!

+0

mit Ihrem Satz von Einschränkungen, können Sie nicht. –

+2

Wie Sie sehen können, finde ich eine Klasse, die jedes Bild nur mit PHP skaliert: https://gist.github.com/3769812 Das ist also möglich, aber die Klasse ist nicht gut dokumentiert. Ich werde alle diese Zeilen überprüfen und verstehen, wenn niemand eine einfachere Lösung hat: s – Sybio

Antwort

1

Ich mag keine Software, externe Bibliothek verwendet werden (wie ImageMagick)

Nun, mit dem Glück, denn 90% der Funktionalität des Motors Exporte Zend mit der PHP-Laufzeit kommt aus Bibliotheken.

Wenn Sie eine Idee haben, höre ich Sie ^^!

Analysieren Sie die Binärdaten im GIF-Format. Sie könnten unter anderem unpack() verwenden.

+0

Wie würdest du die Frames eines animierten Gif auspacken? –

+0

Meine Antwort erwähnt "unter anderem" wie normale Programmierkonstrukte, Schleifen, Bedingungen. Nicht "entpacken()" ist das Schlüsselwort dort, aber ** parse **. – Flavius

+1

Vereinbart, dass Parsing hier der Schlüssel ist. Es sieht einfach nicht so aus als wäre "entpacken()" eine praktikable Möglichkeit, um animierte Gif-Frames zu bekommen, zumindest von dem, was ich sagen kann, wenn ich durch Formate blicke, die es unterstützt.http://php.net/manual/en/function.pack.php –

3

Nun, ich empfehle es nicht so, aber hier ist eine Option. Animierte Gifs sind eigentlich nur eine Anzahl von Gifs, die durch ein Trennzeichen "\ x00 \ x21 \ xF9 \ x04" verkettet sind. Wenn Sie das wissen, ziehen Sie das Bild einfach als String in PHP, führen eine Explosion aus und durchlaufen das Array, in dem Ihre Transformation ausgeführt wird. Der Code könnte in etwa so aussehen.

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

Ich bin nicht 100% sicher, dass die Besonderheiten der Wiederverkettungs, das Bild, aber hier ist die wikipedia page regarding the file format of animated GIFs.

+0

Ich habe versucht Ihre Lösung, aber es funktioniert nicht :(Danke trotzdem ^^ – Sybio

2

Ich bin der Autor der https://github.com/stil/gif-endec Bibliothek, die deutlich schneller ist (etwa 2,5 mal) bei der Entschlüsselung von GIFs als Sybio/GifFrameExtractor Bibliothek aus akzeptierten Antwort. Es hat auch weniger Speicherverbrauch, weil es Ihnen ermöglicht, ein Bild nach dem anderen zur Dekodierzeit zu verarbeiten, ohne alles auf einmal in den Speicher zu laden.

Kleines Codebeispiel:

<?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" 
    ); 
}); 
Verwandte Themen