2009-08-25 37 views

Trả lời

0

Tôi không biết cách nào để làm điều đó ở phía khách hàng, nhưng tôi không chắc chắn về điều đó. Những gì bạn có thể làm, là phân tích mã HTML và bất kỳ gif được tham chiếu nào ở phía máy chủ và thêm lớp vào những hình ảnh này. Nhưng điều đó không thực sự được đề xuất vì nó liên quan đến ít nhất một phân tích cú pháp phân tích cú pháp HTML + của mỗi gif. Như bạn có thể thấy từ this example in PHP, việc kiểm tra gif cũng không đáng kể về tải CPU.

+0

Tôi đồng ý với chất hóa học cặn, tôi không nghĩ rằng có cách nào để làm điều này trong javascript – Josh

+0

tôi nghĩ, có lẽ cái gì là có thể với Canvas-API. Chỉ cần lấy mẫu hình ảnh sau mỗi x mili giây và tính giá trị băm của hình ảnh. Không quá đáng tin cậy, nhưng nó có thể hoạt động ... – doekman

14

Tôi vừa viết một số JS để phát hiện các hình động. Hoạt động trong hầu hết các trình duyệt hiện đại trừ IE 9.

Tuyên bố từ chối trách nhiệm: điều này chỉ hoạt động nếu tên miền của hình ảnh giống với trang bạn đang tải tập lệnh.

Xem các ý chính cho phiên bản mới nhất của mã: https://gist.github.com/3012623

function isAnimatedGif(src, cb) { 
    var request = new XMLHttpRequest(); 
    request.open('GET', src, true); 
    request.responseType = 'arraybuffer'; 
    request.addEventListener('load', function() { 
     var arr = new Uint8Array(request.response), 
      i, len, length = arr.length, frames = 0; 

     // make sure it's a gif (GIF8) 
     if (arr[0] !== 0x47 || arr[1] !== 0x49 || 
      arr[2] !== 0x46 || arr[3] !== 0x38) 
     { 
      cb(false); 
      return; 
     } 

     //ported from php http://www.php.net/manual/en/function.imagecreatefromgif.php#104473 
     //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) (some variants may use \x00\x21 ?) 
     // We read through the file til we reach the end of the file, or we've found 
     // at least 2 frame headers 
     for (i=0, len = length - 9; i < len, frames < 2; ++i) { 
      if (arr[i] === 0x00 && arr[i+1] === 0x21 && 
       arr[i+2] === 0xF9 && arr[i+3] === 0x04 && 
       arr[i+8] === 0x00 && 
       (arr[i+9] === 0x2C || arr[i+9] === 0x21)) 
      { 
       frames++; 
      } 
     } 

     // if frame count > 1, it's animated 
     cb(frames > 1); 
    }); 
    request.send(); 
} 
+0

Điều gì sẽ xảy ra nếu tất cả các khung có dữ liệu giống nhau? Sau đó, gif sẽ được phát hiện như là hoạt hình trong khi thực sự nó không. Một giải pháp đơn giản (nhưng đắt hơn) sẽ thực sự so sánh dữ liệu khung cho đến khi bạn tìm thấy hai dữ liệu thực sự khác nhau. – Gautam

+0

Điểm tốt @Gautam Tôi muốn được quan tâm đến việc xem triển khai nếu bạn làm! – lakenen

+0

Haha, đừng giữ hơi thở của bạn :) Điều đó có ý nghĩa như một cái gì đó để xem xét cho ai đó suy nghĩ về việc sử dụng chức năng này. Tôi không lường trước được bản thân mình đang triển khai nó bất cứ lúc nào ... – Gautam

Các vấn đề liên quan