Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can I detect animated gifs using php and gd?

Tags:

php

gd

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

like image 635
Kris Avatar asked Nov 11 '08 11:11

Kris


People also ask

How do you know if an animated GIF?

1 Answer. Show activity on this post. Basically, if identify returns more than one line for a GIF, it's likely animated because it contains more than one image.

Does IMG tag support GIF?

img tag supports JPG/JPEG/PNG/GIF formats.

What metadata does a GIF have?

The GIF image metadata format encodes the image descriptor, local color table, and extension information assciated with a single image within a GIF file, typically a frame of an animation.

Can you use GIFs in Unity 2D?

Yes it is which if your gif is not so long would not be a huge problem. On top of that, making animation with sprite takes 5min. the simplest solution is to use 2DToolkit. even though Unity now has a 2D system, almost all big projects still use 2DToolkit as it is just so easy for certain things.


1 Answers

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; } 
like image 183
Martijn Heemels Avatar answered Sep 19 '22 15:09

Martijn Heemels