JS - obtenha largura e altura da imagem do código base64

Respostas:

145
var i = new Image(); 

i.onload = function(){
 alert( i.width+", "+i.height );
};

i.src = imageData; 
gp.
fonte
simplesmente incrível, leva meio tempo para verificar o tamanho, muito obrigado!
bombástico
5
uma pena que este seja um processo assíncrono.
Coen Damen
@CoenDamen yep. Eu preciso de um processo síncrono também.
1,21 gigawatts
Você é incrível
Valdrinium de
12
Eu acrescentaria também que a ordem aqui é muito importante. Se você fizer isso ao contrário (src antes de onload), poderá perder o evento. Consulte: stackoverflow.com/a/2342181/4826740
maxshuty
33

Para uso síncrono, basta envolvê-lo em uma promessa 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
  })
}

então, você pode usar await para obter os dados no estilo de codificação síncrona:

var dimensions = await getImageDimensions(file)
EscapeNetscape
fonte
1
Porém, ainda é assíncrono. Apenas usando açúcar sintático.
gustavopch
'naturalWidth' e 'naturalHeight` são as melhores escolhas, não? stackoverflow.com/questions/28167137/…
Crashalot
6

Achei isso usando .naturalWidthe .naturalHeighttive os melhores 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);
};

Isso só é compatível com navegadores modernos. http://www.jacklmoore.com/notes/naturalwidth-and-naturalheight-in-ie/

Bill Keller
fonte
2

Crie um oculto <img>com essa imagem e use jquery .width () e. altura()

$("body").append("<img id='hiddenImage' src='"+imageData+"' />");
var width = $('#hiddenImage').width();
var height = $('#hiddenImage').height();
$('#hiddenImage').remove();
alert("width:"+width+" height:"+height);

Teste aqui: FIDDLE

A imagem não é criada inicialmente oculta. ele é criado, então você obtém largura e altura e então o remove. Isso pode causar uma visibilidade muito curta em imagens grandes. Nesse caso, você deve envolver a imagem em outro contêiner e tornar esse contêiner oculto, não a própria imagem.


Outro Fiddle que não adiciona ao dom conforme o anser da gp.: AQUI

Desu
fonte
var i = nova imagem (); i.src = imageData; setTimeout (function () {alert ("largura:" + i.width + "height:" + i.height);}, 100);
gp.
esta é apenas uma correção necessária devido à natureza do jsfiddle, você pode alterar onLoad para onDomReady em vez de corrigir o problema inicial de largura e altura 0. O código pressupõe que você chame essa função em algum lugar de seu trabalho onde o documento já esteja carregado.
Desu
Acho que seu ponto é que você não precisa adicionar nada ao dom para obter largura e altura. Modificará a resposta para refletir suas sugestões.
Desu