Obtenga el ancho y la altura de la imagen del código Base64 en JavaScript

4 minutos de lectura

avatar de usuario de grandilocuente
rimbombante

Tengo una imagen codificada en Base64 que puedes encontrar aquí. ¿Cómo puedo obtener la altura y el ancho de la misma?

  • 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

avatar de usuario de gp.
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

Avatar de usuario de Bill Keller
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

Avatar de usuario de Waruyama
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

Avatar de usuario de Desu
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

¿Ha sido útil esta solución?