Getting an image dimensions

给你一囗甜甜゛ 提交于 2019-12-12 04:24:58

问题


I've got a problem with getting image dimensions. I want to know the width and height of image without its loading into document. At present I have code as follows:

 function getImageSize (path) {
  var image = new Image();
  image.name = path;
  var d = image.onload = function() {
   var w = this.width;
   var h = this.height;
   return {width : w, height : h};
  }();
  image.src = path;
  return d;
 }

If I call that function, I get object containing undefined in both index (w, h). I've tried not call onload handler by exclude parenthesis (8 line) but what I get is function code.

Note that if I call alert(w) inside onload handler body, I can see width of picture but outside it not.

Does someone know how to solve that problem? How can I get image dimension?


回答1:


This block

var d = image.onload = function() {
   var w = this.width;
   var h = this.height;
   return {width : w, height : h};
}();

looks very fishy. This is actually executing the function immediately and assigning the object {width : w, height : h} to image.onload and d. w and h will contain the width and height of the window because this will refer to window.

You have to assign the function to image.onload, not execute it. The reason you have to assign the function is that it takes time to load the image and the callback gets called once the image was loaded. The whole process is asynchronous. That also means that you cannot return the dimensions of the image from getImageSize. You have to make it accept a callback, which you have to call in the load callback.

For example:

function getImageSize (path, callback) {
  var image = new Image();
  image.name = path;
  image.onload = function() {
   callback({width : this.width, height : this.height};
  }
  image.src = path;
};

and call the function with

getImageSize('path/to/image', function(dim) {
    // do something with dim.width, dim.height
});

Have a look at the first part of my answer here to learn about the difference of synchronous and asynchronous code, and the role of callbacks.




回答2:


onload is an asynchronous call and cannot return anything useful out of the calling function.

You will have to use a global variable and timer check to wait for the function to complete and then access the values.



来源:https://stackoverflow.com/questions/15460023/getting-an-image-dimensions

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!