您知道GIF文件支持动画,但是GIF图像不一定必须在其上具有动画。
是否可以使用php或java检查GIF图像是否具有动画?
谢谢。
<?php
$img="your_image";
$file = file_get_contents($img);
$animated=preg_match('#(\x00\x21\xF9\x04.{4}\x00\x2C.*){2,}#s', $file);
if ($animated==1){
echo "This image is an animated gif";
} else {
echo "This image is not an animated gif";
}
?>
只需将$ img变量编辑为要测试的任何图像(例如image.gif,image.jpg)。
<?php
function is_ani($filename)
{
$filecontents=file_get_contents($filename);
$str_loc=0;
$count=0;
while ($count < 2) # There is no point in continuing after we find a 2nd frame
{
$where1=strpos($filecontents,"\x00\x21\xF9\x04",$str_loc);
if ($where1 === FALSE)
{
break;
}
else
{
$str_loc=$where1+1;
$where2=strpos($filecontents,"\x00\x2C",$str_loc);
if ($where2 === FALSE)
{
break;
}
else
{
if ($where1+8 == $where2)
{
$count++;
}
$str_loc=$where2+1;
}
}
}
if ($count > 1)
{
return(true);
}
else
{
return(false);
}
}
exec("ls *gif" ,$allfiles);
foreach ($allfiles as $thisfile)
{
if (is_ani($thisfile))
{
echo "$thisfile is animated<BR>\n";
}
else
{
echo "$thisfile is NOT animated<BR>\n";
}
}
?>
如果需要,可以很容易地对其进行修改以计算帧数。
See Here
public function getNumFramesFromGif(string $url): int{
$image = file_get_contents($url);
$imagick = new \Imagick();
$imagick->readImageBlob($image);
$numFrames = $imagick->identifyFormat("%n"); //https://www.php.net/manual/en/imagick.identifyformat.php https://davidwalsh.name/detect-gif-animated
return $numFrames;
}
如果返回1,则不进行动画处理。
由于this之类的“陷阱”,我不使用Imagick之类的库来编码函数时会很警惕。