由于 gd 和 imagick 不支持动画 PNG(目前),我编写了一个简单的函数来确定给定的 PNG 是否是 APNG。它不验证 PNG,只检查“acTL”块是否出现在“IDAT”之前,如规范中所述:https://wiki.mozilla.org/APNG_Specification
<?php
function is_apng(string $filename): bool
{
$f = new \SplFileObject($filename, 'rb');
$header = $f->fread(8);
if ($header !== "\x89PNG\r\n\x1A\n") {
return false;
}
while (!$f->eof()) {
$bytes = $f->fread(4);
if (strlen($bytes) < 4) {
return false;
}
$length = unpack('N', $bytes)[1];
$chunkname = $f->fread(4);
switch ($chunkname) {
case 'acTL':
return true;
case 'IDAT':
return false;
}
$f->fseek($length + 4, SEEK_CUR);
}
return false;
}
?>