GIF 動畫基於 GIF89a 格式,檔案頭部包含特徵標識 chr(0x21).chr(0xff).chr(0x0b).'NETSCAPE2.0'。其中:
chr(0x21).chr(0xff):擴展區塊標頭chr(0x0b):子區塊大小NETSCAPE2.0:應用程式擴展標識符(Netscape 2.0 循環擴展)注意:透明 GIF 也可能使用 GIF89a 格式,單純判斷檔案頭 GIF89a 不足以區分動畫。
<?php
function check($image) {
$content = file_get_contents($image);
$pattern = "/" . chr(0x21) . chr(0xff) . chr(0x0b) . 'NETSCAPE2.0' . "/";
return preg_match($pattern, $content) ? true : false;
}
// 測試
if (check('/home/lyy/luoyinyou/2.gif')) {
echo '是動畫';
} else {
echo '不是動畫';
}
?>
特徵標識位於檔案頭部區域,無需讀取整個檔案,大幅提升效率並節省記憶體:
function check_animation($image_file) {
$fp = fopen($image_file, 'rb');
$image_head = fread($fp, 1024); // 讀取前 1KB
fclose($fp);
$pattern = "/" . chr(0x21) . chr(0xff) . chr(0x0b) . 'NETSCAPE2.0' . "/";
return preg_match($pattern, $image_head) ? true : false;
}
實測讀取 1024 位元組已足夠包含完整的 NETSCAPE2.0 標識區塊,該方法在大檔案處理上效能顯著優於全文件讀取。