从url获取远程图像的宽度高度

问题描述 投票:57回答:4

因此警报给出了宽度和高度的未定义值。我认为来自img.onload计算的图像的w和h值没有被传递给要返回的值,或者它可能在onload计算它们之前返回w和h:

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');

如何让警报显示正确的宽度和高度?

http://jsfiddle.net/YtqXk/

javascript image height width
4个回答
96
投票

使用jQuery获取图像大小

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

使用JavaScript获取图像大小

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

使用JavaScript获取图像大小(现代浏览器,IE9 +)

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

使用上面的简单如:getMeta( "http://example.com/img.jpg" );

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


19
投票

只需将回调作为参数传递,如下所示:

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') }
);

10
投票

w函数中的himg.onload变量与getMeta()函数中的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"); 变量的范围不同。一种方法,如下:

小提琴:async/await

getMeta

5
投票

ES6:使用await你可以按照类似的方式在end函数下面做,你可以按如下方式使用它(这与你的问题中的代码几乎相同(我添加img关键字并将变量var更改为let,并将getMeta更改为await关键字你只需要从async函数运行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" />(运行)。

qazxswpoi
qazxswpoi
© www.soinside.com 2019 - 2024. All rights reserved.