tags:

views:

2581

answers:

3

Hi all,

I'm currently running into some issues resizing images using GD.

Everything works fine until i want to resize an animated gif, which delivers the first frame on a black background.

I've tried using getimagesize but that only gives me dimensions and nothing to distinguish between just any gif and an animated one.

Actual resizing is not required for animated gifs, just being able to skip them would be enough for our purposes.

Any clues?

PS. I don't have access to imagemagick.

Kind regards,

Kris

+9  A: 

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

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

Davide Gualano
Weird that I didn't find that in my default mirror of the manual, but tanks a lot for the link. I modified the function and gave both the original poster and you credit in comment.
Kris
+4  A: 

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;
}
Kris
+5  A: 

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#s', $chunk, $matches);

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