2011-06-03 7 views
5

Usando JavaScript, ¿cómo puedo determinar el tamaño de una imagen que no está en el documento sin insertarla en el documento?Determine el tamaño de la imagen en JavaScript sin la etiqueta `<img>`

¿Puedo descargar la imagen usando AJAX y verificar su altura y ancho programáticamente?

Algo así como ...

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(); 

voy a estar utilizando Raphael, por lo que si ofrece funcionalidad a este efecto, que se adapte a mis necesidades.

Respuesta

8

No necesita ajax.

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

+1, con las advertencias habituales sobre "onload" para las imágenes: en algunos navegadores, el evento no se activará cuando la imagen se almacena en caché. (Consulte "Advertencias del evento de carga cuando se utiliza con imágenes" [aquí] (http://api.jquery.com/load-event/)) –

+0

+1 ¡Tiene demasiado sentido! * facepalm * –

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

Esta es la dirección correcta, pero no funcionará sin embargo - lo que si la imagen no ha cargado aún cuando verificar el alto/ancho? –

1

No es necesario añadir al documento para medir su tamaño, pero sí tiene que esperar a que por lo menos parcialmente la carga. Si es necesario hacerlo para posiblemente más de una imagen a la vez, y tienen que llamar a una devolución de llamada tan pronto como el tamaño está disponible, puede utilizar mi módulo ImageLoader:

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

¿Es imageloader ECMA estándar o algo así, o una biblioteca? ¿Puedes vincularlo? –

+1

@Richard: no, todo el código está pegado arriba. Todo lo que tiene que hacer es incluir el código y luego llamar a "ImageLoader.loadImage", proporcionando una función de devolución de llamada y una url de la imagen. Lo bueno de esto es que en una imagen grande, obtendrás la devolución de llamada (con el tamaño) mucho antes de que se cargue toda la imagen. – rob

+0

Oh. Lo siento; la lectura falla de mi parte. ¡Gracias! : D –

2

Aquí hay una fiddle para usted. Solo use el objeto Image.

+0

+1 para Lorempixum - ¡interesante! – pimvdb

+0

Gracias. Lo descubrí a través de @Neal. Muy útil, lo sé. Estoy seguro de que leerá este comentario con el tiempo:] – pixelbobby

-1

Si conoce el origen de la imagen se puede utilizar un objeto de imagen javascript:

function MEGIC_GET_FILE_SIZE_FUNCTION(src){ 
    var img = new Image(); 
    img.src = src; 
    return {height: img.height, width: img.width}; 
} 
Cuestiones relacionadas