28 votes

Puis-je détecter des gifs animés en utilisant php et gd?

Je suis actuellement en cours d'exécution dans certains problèmes de redimensionnement d'images à l'aide de GD.

Tout fonctionne bien jusqu'à ce que je veux redimensionner un gif animé, qui offre la première image sur un fond noir.

J'ai essayé à l'aide d' getimagesize mais qui ne me donne les dimensions et rien à la distinction entre un gif et un animé.

Redimensionnement réel n'est pas nécessaire pour les gifs animés, juste être capable de les ignorer serait suffisant pour nos besoins.

Des indices?

PS. Je n'ai pas accès à imagemagick.

Cordialement,

Kris

29voto

Martijn Heemels Points 1725

En cherchant une solution au même problème, j'ai remarqué que le site php.net a un suivi du code auquel Davide et Kris font référence, mais, selon l'auteur, moins gourmand en mémoire et peut-être moins gourmand en disque. .

Je vais le reproduire ici, car cela peut être intéressant.

source: http://www.php.net/manual/en/function.imagecreatefromgif.php#88005

 function is_ani($filename) {
    if(!($fh = @fopen($filename, 'rb')))
        return false;
    $count = 0;
    //an animated gif contains multiple "frames", with each frame having a
    //header made up of:
    // * a static 4-byte sequence (\x00\x21\xF9\x04)
    // * 4 variable bytes
    // * a static 2-byte sequence (\x00\x2C)

    // We read through the file til we reach the end of the file, or we've found
    // at least 2 frame headers
    while(!feof($fh) && $count < 2) {
        $chunk = fread($fh, 1024 * 100); //read 100kb at a time
        $count += preg_match_all('#\x00\x21\xF9\x04.{4}\x00\x2C#s', $chunk, $matches);
    }

    fclose($fh);
    return $count > 1;
}
 

15voto

Davide Gualano Points 5832

Il y a un bref extrait de code dans la page de manuel php des fonctions imagecreatefromgif (), ce qui devrait être ce dont vous avez besoin:

http://it.php.net/manual/en/function.imagecreatefromgif.php#59787

5voto

Kris Points 11892

Voici la fonction de travail:

 /**
 * Thanks to ZeBadger for original example, and Davide Gualano for pointing me to it
 * Original at http://it.php.net/manual/en/function.imagecreatefromgif.php#59787
 **/
function is_animated_gif( $filename )
{
    $raw = file_get_contents( $filename );

    $offset = 0;
    $frames = 0;
    while ($frames < 2)
    {
    	$where1 = strpos($raw, "\x00\x21\xF9\x04", $offset);
    	if ( $where1 === false )
    	{
    		break;
    	}
    	else
    	{
    		$offset = $where1 + 1;
    		$where2 = strpos( $raw, "\x00\x2C", $offset );
    		if ( $where2 === false )
    		{
    			break;
    		}
    		else
    		{
    			if ( $where1 + 8 == $where2 )
    			{
    				$frames ++;
    			}
    			$offset = $where2 + 1;
    		}
    	}
    }

    return $frames > 1;
}
 

3voto

Stevio Points 56

Dans la réponse de Martijn Heemels, ai-je raison de dire qu'il devrait y avoir des accolades autour des deux lignes en retrait après la ligne while comme suit?

 while(!feof($fh) && $count < 2){
  $chunk = fread($fh, 1024 * 100); //read 100kb at a time
  $count += preg_match_all('#\x00\x21\xF9\x04.{4}\x00\x2C#s', $chunk, $matches);
}
 

-1voto

user2731504 Points 29

Le GIF animé doit avoir la chaîne suivante

 "\x21\xFF\x0B\x4E\x45\x54\x53\x43\x41\x50\x45\x32\x2E\x30"
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X