2011-07-04 17 views
25

He leído acerca de varios modos de obtener dimensiones de imagen una vez que la imagen se ha cargado completamente, pero sería posible obtener las dimensiones de cualquier imagen una vez que acaba de comenzar a cargarse ?Obtener dimensiones de imagen con Javascript antes de que la imagen se cargue completamente

No he encontrado mucho sobre esto buscando (que me hace creer que no es posible), pero el hecho de que un navegador (en mi caso Firefox) muestra las dimensiones de cualquier imagen que abro en una nueva pestaña en el título después de que acaba de comenzar a cargar la imagen me da esperanza de que realmente haya una manera y me perdí las palabras clave correctas para encontrarla.

Respuesta

35

Tiene razón de que uno puede obtener las dimensiones de la imagen antes de que esté completamente cargada.

he aquí una solución (demo):

var img = document.createElement('img'); 

img.src = 'some-image.jpg'; 

var poll = setInterval(function() { 
    if (img.naturalWidth) { 
     clearInterval(poll); 
     console.log(img.naturalWidth, img.naturalHeight); 
    } 
}, 10); 

img.onload = function() { console.log('Fully loaded'); } 
+3

Esto es muy bueno de saber. Lo único que agregaría es que si el img tiene un alto o ancho establecido en la etiqueta de la imagen o en el CSS, entonces su método simplemente devuelve ese valor, no el tamaño natural de la imagen. Algunos navegadores admiten los atributos naturalWidth y naturalSize. Puedes verlo aquí en este mod de tu violín http://jsfiddle.net/jfriend00/rQwD4/ – jfriend00

+0

¡Sorprendente, gracias! – katspaugh

+0

@katspaugh Gracias por su comentario y la demostración proporcionada, ¡es lo que he estado buscando! @ jfriend00 Conocía el problema del tamaño natural, pero gracias por el ejemplo modificado, significa menos trabajo para mí. – user828591

1

Una forma es usar la solicitud HEAD, que solo solicita el encabezado HTTP de la respuesta. Sé que en las respuestas HEAD, el tamaño del cuerpo está incluido. Pero no sé si hay algo disponible para el tamaño de las imágenes.

+2

No estoy seguro de que las dimensiones de una imagen es en la respuesta de la cabeza, y de todos modos, sólo se podía hacer esto en 'petición del mismo origen controlado, o si usted específicamente la configuración de su servidor para permitir que' cruz -origin'. – vsync

0

En realidad, es mucho más fácil, sólo hay que ir a buscar las dimensiones en función onload de la imagen.

var tempImage1 = new Image(); 
tempImage1.src = "path/to/image"; 
tempImage1.onload = function() { 
    console.log(tempImage1.width, tempImage1.height); 
} 
+2

Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar aclaraciones de un autor, deje un comentario debajo de su publicación; siempre puede comentar sus propias publicaciones, y una vez que tenga suficiente [reputación] (http://stackoverflow.com/help/whats-reputation) lo hará poder [comentar cualquier publicación] (http://stackoverflow.com/help/privileges/comment). –

+0

@EricBrown Esta es la respuesta. Muy posiblemente no sea la respuesta deseada o incluso la respuesta correcta, pero una respuesta sin embargo. –

+0

@ArtjomB. Había leído mal la pregunta; Pensé que era 'sin cargar la imagen' * en absoluto *, y no 'sin * completamente * cargar la imagen'. –

10

El siguiente código devuelve ancho/alto tan pronto como esté disponible. Para las pruebas, cambie abc123 en el origen de la imagen a cualquier cadena aleatoria para evitar el almacenamiento en caché.

También hay un JSFiddle Demo.

<div id="info"></div> 
<img id="image" src="https://upload.wikimedia.org/wikipedia/commons/d/da/Island_Archway,_Great_Ocean_Rd,_Victoria,_Australia_-_Nov_08.jpg?abc123"> 

<script> 
getImageSize($('#image'), function(width, height) { 
    $('#info').text(width + ',' + height); 
}); 

function getImageSize(img, callback) { 
    var $img = $(img); 

    var wait = setInterval(function() { 
     var w = $img[0].naturalWidth, 
      h = $img[0].naturalHeight; 
     if (w && h) { 
      clearInterval(wait); 
      callback.apply(this, [w, h]); 
     } 
    }, 30); 
} 
</script> 
+2

esta debería ser la respuesta aceptada – Toskan

+2

Esta es una buena alternativa de jQuery, pero no debería ser la respuesta aceptada ya que agrega dependencia que no ha sido requerida por el OP. – rzb

Cuestiones relacionadas