rimbombante
Tengo una imagen codificada en Base64 que puedes encontrar aquí. ¿Cómo puedo obtener la altura y el ancho de la misma?
gp.
var i = new Image();
i.onload = function(){
alert(i.width + ", " + i.height);
};
i.src = imageData;
-
simplemente increíble, lleva la mitad del tiempo verificar el tamaño, ¡muchas gracias!
– rimbombante
21 de julio de 2013 a las 20:11
-
Lástima que este es un proceso asíncrono.
– Coen Damen
2 de agosto de 2015 a las 11:06
-
@CoenDamen sí. También necesito un proceso síncrono.
– 1,21 gigavatios
14 de diciembre de 2016 a las 19:08
-
Usted es maravilloso
– Valdrinio
15 de febrero de 2017 a las 14:38
-
También agregaría que el orden aquí es muy importante. Si hace esto al revés (src antes de cargar), es posible que se pierda el evento. Ver: stackoverflow.com/a/2342181/4826740
– maxshuty
4 de abril de 2017 a las 17:58
Para uso síncrono, simplemente envuélvalo en una promesa como esta:
function getImageDimensions(file) {
return new Promise (function (resolved, rejected) {
var i = new Image()
i.onload = function(){
resolved({w: i.width, h: i.height})
};
i.src = file
})
}
luego puede usar await para obtener los datos en estilo de codificación síncrona:
var dimensions = await getImageDimensions(file)
-
Sin embargo, todavía es asíncrono. Solo usando azúcar sintáctico.
– gustavopch
15 de julio de 2019 a las 23:27
-
‘naturalWidth’ y ‘naturalHeight` son las mejores opciones, ¿no? stackoverflow.com/questions/28167137/…
– Crashalot
27 de diciembre de 2019 a las 23:28
Bill Keller
Descubrí que usando .naturalWidth
y .naturalHeight
tuvo los mejores resultados.
const img = new Image();
img.src="https://via.placeholder.com/350x150";
img.onload = function() {
const imgWidth = img.naturalWidth;
const imgHeight = img.naturalHeight;
console.log('imgWidth: ', imgWidth);
console.log('imgHeight: ', imgHeight);
};
Documentación:
Esto solo es compatible con los navegadores modernos. NaturalWidth y NaturalHeight en IE
-
Exactamente, es el tamaño original de la imagen antes de ser redimensionado por
object-fit
– Cao Mạnh Quang
15 de febrero de 2021 a las 4:09
Waruyama
Una solución más moderna es utilizar HTMLImageElement.decode()
en vez de onload
evento. decode()
devuelve una promesa y, por lo tanto, se puede usar sincrónicamente con await
.
Uso asíncrono:
let img = new Image();
img.src = "myImage.png";
img.decode().then(() => {
let width = img.width;
let height = img.height;
// Do something with dimensions
});
Uso síncrono (dentro de una función asíncrona):
let img = new Image();
img.src = "myImage.png";
await img.decode();
let width = img.width;
let height = img.height;
// Do something with dimensions
Desu
Crear un oculto <img>
con esa imagen y luego use jQuery’s .width() y . altura()
$("body").append("<img id='hiddenImage' src="https://stackoverflow.com/questions/17774928/" + imageData + "" />");
var width = $('#hiddenImage').width();
var height = $('#hiddenImage').height();
$('#hiddenImage').remove();
alert("width:" + width + " height:" + height);
Prueba aquí: JSFiddle
La imagen no se crea inicialmente oculta. Se crea, y luego obtienes ancho y alto y luego lo eliminas. Esto puede causar una visibilidad muy corta en imágenes grandes. En este caso, debe envolver la imagen en otro contenedor y ocultar ese contenedor, no la imagen en sí.
Otro violín que no se agrega al DOM según la respuesta de gp.:
aquí
-
var i = nueva imagen (); i.src = datos de imagen; setTimeout(función(){ alerta (“ancho:”+ i.ancho+” alto:” + i.alto); },100);
– g.p.
21 de julio de 2013 a las 17:59
-
esta es solo una solución necesaria debido a la naturaleza de jsfiddle, puede cambiar onLoad a onDomReady en su lugar para solucionar ese problema inicial de ancho y alto 0. El código asume que llama a esta función en algún lugar de su trabajo donde el documento ya está cargado.
– Desu
21 de julio de 2013 a las 18:04
-
Supongo que su punto era que no necesita agregar nada a dom para obtener ancho y alto. Modificará la respuesta para reflejar sus sugerencias.
– Desu
21 de julio de 2013 a las 18:14
-
var i = nueva imagen (); i.src = datos de imagen; setTimeout(función(){ alerta (“ancho:”+ i.ancho+” alto:” + i.alto); },100);
– g.p.
21 de julio de 2013 a las 17:59
-
esta es solo una solución necesaria debido a la naturaleza de jsfiddle, puede cambiar onLoad a onDomReady en su lugar para solucionar ese problema inicial de ancho y alto 0. El código asume que llama a esta función en algún lugar de su trabajo donde el documento ya está cargado.
– Desu
21 de julio de 2013 a las 18:04
-
Supongo que su punto era que no necesita agregar nada a dom para obtener ancho y alto. Modificará la respuesta para reflejar sus sugerencias.
– Desu
21 de julio de 2013 a las 18:14
Link rot se ha establecido para esta pregunta
– Lucas
10 de enero de 2022 a las 12:35
Sí. “Hmm. Estamos teniendo problemas para encontrar ese sitio. No podemos conectarnos al servidor en soo.gd”.
-Peter Mortensen
hace 2 días