web-dev-qa-db-fra.com

Obtenir la largeur hauteur de l'image distante à partir de l'URL

Donc, l'alerte donne des valeurs indéfinies pour la largeur et la hauteur. Je pense que les valeurs w et h de l’image issue du calcul img.onload ne sont pas transmises aux valeurs à renvoyer, ou qu’elles renvoient w et h avant la charge les calcule:

function getMeta(url){
 var w; var h;
 var img=new Image;
 img.src=url;
 img.onload=function(){w=this.width; h=this.height;};
 return {w:w,h:h}    
}

// "http://snook.ca/files/mootools_83_snookca.png" //1024x678
// "http://shijitht.files.wordpress.com/2010/08/github.png" //128x128

var end = getMeta("http://shijitht.files.wordpress.com/2010/08/github.png");
var w = end.w;
var h = end.h;
alert(w+'width'+h+'height');

Comment puis-je avoir l'alerte montrer la largeur et la hauteur correctes?

http://jsfiddle.net/YtqXk/

60
Wonka

Obtenir la taille de l'image avec jQuery

function getMeta(url){
    $("<img/>",{
        load : function(){
            alert(this.width+' '+this.height);
        },
        src  : url
    });
}

Obtenir la taille de l'image avec JavaScript

function getMeta(url){   
    var img = new Image();
    img.onload = function(){
        alert( this.width+' '+ this.height );
    };
    img.src = url;
}

Obtenir une taille d'image avec JavaScript (navigateurs modernes, IE9 +)

function getMeta(url){   
    var img = new Image();
    img.addEventListener("load", function(){
        alert( this.naturalWidth +' '+ this.naturalHeight );
    });
    img.src = url;
}

Utilisez ce qui précède simplement comme: getMeta( "http://example.com/img.jpg" );

https://developer.mozilla.org/en/docs/Web/API/HTMLImageElement

100
Roko C. Buljan

Il suffit de passer un callback comme argument comme ceci:

function getMeta(url, callback) {
    var img = new Image();
    img.src = url;
    img.onload = function() { callback(this.width, this.height); }
}
getMeta(
  "http://snook.ca/files/mootools_83_snookca.png",
  function(width, height) { alert(width + 'px ' + height + 'px') }
);
19
feychu

Les variables w et h de la fonction img.onload N'ont pas la même portée que celles de la fonction getMeta(). Une façon de le faire est la suivante:

Violon : http://jsfiddle.net/ppanagi/28UES/2/

function getMeta(varA, varB) {
    if (typeof varB !== 'undefined') {
       alert(varA + ' width ' + varB + ' height');
    } else {
       var img = new Image();
       img.src = varA;
       img.onload = getMeta(this.width, this.height);
    }
}


getMeta("http://snook.ca/files/mootools_83_snookca.png");
10
Panagiotis Panagi

ES6: Utilisation de async/await vous pouvez faire ci-dessous getMeta fonctionner comme une séquence et l’utiliser comme suit (qui est presque identique au code de votre question (j’ajoute await mot clé et change la variable end à img, et remplacez var par let mot-clé). Vous devez exécuter getMeta par await uniquement à partir de async fonction (exécuter).

function getMeta(url) {
    return new Promise((resolve, reject) => {
        let img = new Image();
        img.onload = () => resolve(img);
        img.onerror = reject;
        img.src = url;
    });
}

async function run() {

  let img = await getMeta("http://shijitht.files.wordpress.com/2010/08/github.png");

  let w = img.width;
  let h = img.height; 

  size.innerText = w+' width, '+h+' height';
  size.appendChild(img);
}

run();
<div id="size" />
5
Kamil Kiełczewski