2011-12-20 12 views
5

¿Cómo puedo obtener el tamaño original, sin escala, de una imagen de javascript si mi imagen es así: <img src="picture.png" style="max-width:100px">?Obteniendo el tamaño original de una imagen escalada

He encontrado mi respuesta, puede utilizar img.naturalWidth para obtener la anchura original

var img = document.getElementsByTagName("img")[0]; 
img.onload=function(){ 
    console.log("Width",img.naturalWidth); 
    console.log("Height",img.naturalHeight); 
} 

Source

+0

@bugster ¿Cómo podemos implementar esto para obtener el tamaño original de una imagen escalada en un sitio web? Si no hay acceso al sitio web, ¿cómo es posible tomar la imagen original? Considere que la URL de la imagen original es un enlace público. –

Respuesta

4

Una forma de hacerlo es crear otro elemento de la imagen, establezca su src para src de la original, y luego leyendo su ancho Esto debería ser económico ya que el navegador ya debería haber guardado en caché la imagen.

var i = document.getElementById('myimg'); 

var i2 = new Image(); 
i2.onload = function() { 
    alert(i2.width); 
}; 

i2.src = i.src; 

Aquí es un violín: http://jsfiddle.net/baZ4Y/

+0

Así es como yo también lo hago, sin embargo, crear un objeto nuevo, completar con datos de imagen y confiar en los mecanismos internos de almacenamiento en caché del navegador para no atascar las cosas me parece un desperdicio. Tiene que haber una mejor manera. – Andri

+0

Pekka señaló que esto ha sido respondido antes, y ese era el enfoque en esa pregunta también. Posiblemente, este es solo un pequeño caso en el que los navegadores/JS no tienen un buen mecanismo para el manejo. –

0

EDIT: Este método es útil si desea recuperar el tamaño calculado de una imagen después de que se hace en una página, pero antes de transformar su tamaño con escala. Si solo desea el tamaño original de la imagen, use los métodos anteriores.

Intente escribir la escala de la imagen en un atributo de datos cuando lo escala. Luego puede dividir fácilmente las nuevas dimensiones con ese atributo de escala para recuperar el tamaño original. Podría ser algo como esto:

// Set the scale data attribute of the image 
var scale = 2; 
img.dataset.scale = scale; 

... 

// Later, retrieve the scale and calculate the original size of the image 
var s = img.dataset.scale; 
var dimensions = [img.width(), img.height()]; 
var originalDimensions = dimensions.map(function(d) {return d/parseFloat(s)}); 

Como alternativa, sólo puede recuperar la escala de la imagen directamente usando jQuery y expresiones regulares.

var r = /matrix\(([\d.]+),/; 
try { 
    var currentTransform = $swiper.css('transform'); 
    var currentScale = currentTransform.match(r)[1]; 
} 
// Handle cases where the transform attribute is unset 
catch (TypeError) { 
    currentScale = 1; 
} 

Esto tiene sentido más intuitivo para mí que la creación de una imagen completamente nueva y confiando en la memoria caché del navegador para que se cargue rápidamente.

+0

Esto no funciona si una imagen es escalada por parámetros en la etiqueta ''. Las imágenes tienen una propiedad '.naturalWidth' y' .naturalHeight' que le permiten obtener las dimensiones originales directamente. – Bugster

+0

Ya veo. Para mi caso de uso, necesitaba obtener no las dimensiones originales de la imagen, sino el tamaño de la imagen tal como se representaba en la página antes de que se escalara. Como estaba dimensionando imágenes con diferentes tamaños originales para adaptarme a un div, las propiedades '.naturalWidth' y' .naturalHeight' no me funcionaron, pero este método sí. ¿Te importa si dejo esta respuesta en caso de que alguien venga aquí con el mismo problema que yo, o debería retirarla? –

Cuestiones relacionadas