首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 判斷 GIF 圖片是否為動畫的高效方法

     編輯:PHP 綜合知識

GIF 動畫偵測原理與實現

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 '不是動畫';
}
?>

優化版:只讀取檔案前 1024 位元組

特徵標識位於檔案頭部區域,無需讀取整個檔案,大幅提升效率並節省記憶體:

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 標識區塊,該方法在大檔案處理上效能顯著優於全文件讀取。

應用場景建議

  • 圖片上傳驗證:上傳時自動識別動態圖片
  • 縮圖生成策略:動畫 GIF 需特殊處理保持動畫效果
  • 內容審核:區分靜態/動態圖片應用不同審核邏輯
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved