2011-06-03 36 views
5

Sử dụng JavaScript, làm cách nào để xác định kích thước của hình ảnh không có trong tài liệu mà không chèn nó vào tài liệu?Xác định kích thước hình ảnh trong JavaScript mà không cần `<img>` tag

Tôi có thể tải xuống hình ảnh bằng AJAX và kiểm tra chiều cao và chiều rộng của chương trình không?

Cái gì đó như ...

var xmlhttp = new XMLHttpRequest(); 
xmlhttp.onreadystatechange = function() { 
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
     var imageSize = MEGIC_GET_FILE_SIZE_FUNCTION(xmlhttp); 
     alert("The image is "+imageSize.width+","+imageSize.height+"."); 
    } 
} 
xmlhttp.open("GET","lena.jpg",true); 
xmlhttp.send(); 

tôi sẽ sử dụng Raphael, vì vậy nếu nó cung cấp chức năng để hiệu ứng này, phù hợp với nhu cầu của tôi.

Trả lời

8

Bạn không cần ajax.

var img = new Image(); 
img.onload = function() { 
    alert("The image is " + this.width + "x" + this.height); 
} 
img.src = "lena.jpg"; 
+1

+1, với thông báo trước về 'onload' cho hình ảnh: Trong một số trình duyệt, sự kiện sẽ không kích hoạt khi hình ảnh được lưu vào bộ nhớ cache. (Xem "Hãy cẩn thận về sự kiện tải khi được sử dụng với hình ảnh" [ở đây] (http://api.jquery.com/load-event/)) –

+0

+1 Nó gần như có ý nghĩa quá nhiều! * facepalm * –

2
var img = new Image(); 
img.src = url; 
var height = img.height; 
var width = img.width; 
+3

Đây là hướng đi đúng, nhưng sẽ không hoạt động được nêu ra - nếu hình ảnh đã không được nạp nhưng khi tôi kiểm tra chiều cao/chiều rộng? –

1

Bạn không cần phải thêm nó vào tài liệu để đo kích thước của nó, nhưng bạn phải đợi cho nó tải ít nhất một phần. Nếu bạn cần phải làm điều đó cho có thể nhiều hơn một hình ảnh cùng một lúc, và có nó gọi một callback càng sớm càng kích thước có sẵn, bạn có thể sử dụng mô-đun imageloader tôi:

var ImageLoader = { 
maxChecks: 1000, 
list: [], 
intervalHandle : null, 

loadImage : function (callback, url) { 
    var img = new Image(); 
    img.src = url; 
    if (img.width && img.height) { 
    callback (mg.width, img.height, url, 0); 
    } 
    else { 
    var obj = {image: img, url: url, callback: callback, checks: 1}; 
    var i; 
    for (i=0; i < this.list.length; i++) { 
     if (this.list[i] == null) 
     break; 
     } 
    this.list[i] = obj; 
    if (!this.intervalHandle) 
     this.intervalHandle = setInterval(this.interval, 30); 
    } 
    }, 

// called by setInterval 
interval : function() { 
    var count = 0; 
    var list = ImageLoader.list, item; 
    for (var i=0; i<list.length; i++) { 
    item = list[i]; 
    if (item != null) { 
     if (item.image.width && item.image.height) { 
     item.callback (item.image.width, item.image.height, item.url, item.checks); 
     ImageLoader.list[i] = null; 
     } 
     else if (item.checks > ImageLoader.maxChecks) { 
     item.callback (0, 0, item.url, item.checks); 
     ImageLoader.list[i] = null; 
     } 
     else { 
     count++; 
     item.checks++; 
     } 
     } 
    } 
    if (count == 0) { 
    ImageLoader.list = []; 
    clearInterval (ImageLoader.intervalHandle); 
    delete ImageLoader.intervalHandle; 
    } 
    } 
}; 
+0

Là trình tải hình ảnh tiêu chuẩn ECMA hay gì đó hoặc thư viện? Bạn có thể liên kết nó không? –

+1

@Richard: không, toàn bộ mã được dán ở trên. Tất cả những gì bạn phải làm là bao gồm mã và sau đó gọi "ImageLoader.loadImage", cung cấp chức năng gọi lại và url của hình ảnh. Điều tốt đẹp về nó là trên một hình ảnh lớn, bạn sẽ nhận được gọi lại của bạn (với kích thước) dài trước khi nó được tải toàn bộ hình ảnh. – rob

+0

Ồ. Lấy làm tiếc; đọc thất bại về phía tôi. Cảm ơn! : D –

2

Dưới đây là một fiddle cho bạn. Chỉ cần sử dụng đối tượng Image.

+0

+1 cho Lorempixum - thú vị! – pimvdb

+0

Cảm ơn. Tôi phát hiện ra nó qua @Neal. Rất hữu ích, tôi biết. Tôi chắc chắn anh ấy sẽ đọc nhận xét này cuối cùng:] – pixelbobby

-1

Nếu bạn biết nguồn gốc của hình ảnh mà bạn có thể sử dụng một đối tượng hình ảnh javascript:

function MEGIC_GET_FILE_SIZE_FUNCTION(src){ 
    var img = new Image(); 
    img.src = src; 
    return {height: img.height, width: img.width}; 
} 
Các vấn đề liên quan