Can I detect animated gifs using php and gd? Can I detect animated gifs using php and gd? php php

Can I detect animated gifs using php and gd?


While searching for a solution to the same problem I noticed that the php.net site has a follow-up to the code Davide and Kris are referring to, but, according to the author, less memory-intensive, and possibly less disk-intensive.

I'll replicate it here, because it may be of interest.

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\x21]#s', $chunk, $matches);    }    fclose($fh);    return $count > 1;}


There is a brief snippet of code in the PHP manual page of the imagecreatefromgif() function that should be what you need:

imagecreatefromgif comment #59787 by ZeBadger


Here's the working function:

/** * 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;}