js获取图片信息(一)-----获取图片的原始尺寸

摘要:
如何获取图片的原始大小#oImg{100px;height:100px;}方法1:HTML5提供了一个新属性naturalWidth/naturalHeight,以直接获取图像的原始宽度和高度。除了在第一次加载图像时恢复正常外,ie在刷新后不会响应。对于大多数浏览器,它们的视图使这两种加载方法对用户透明,这也会导致图像加载事件,而ie忽略此标识,不会导致图像加载。通常,您可以使用complete来确定图像是否已加载。原因见下一节的分析:js获取图像信息(二)-----js获取img的高度和宽度,宽度和高度为0

如何获取图片的原始尺寸大小?

  如下,当给 img 设置一个固定的大小时,要怎样获取图片的原始尺寸呢?

#oImg{
     100px;
    height: 100px;
}
<img src="images/test.jpg" id="oImg" alt="">

方法一:

HTML5提供了一个新属性 naturalWidth / naturalHeight 可以直接获取图片的原始宽高。这两个属性在Firefox/Chrome/Safari/Opera及IE9里已经实现。

 w = document.getElementsByTagName("img")[0].naturalWidth;
 h = document.getElementsByTagName("img")[0].naturalHeight;
    
console.log(w + '  ' + h);

打印出来的结果与原始尺寸相符。但有个前提是,必须在图片完全下载到客户端浏览器才能判断。

如果是不支持的版本浏览器,那可以用传统方法判断,如下:

var img = document.getElementById("oImg"),
  w,h;

if (oImg.naturalWidth) {
  // HTML5 browsers
  w = oImg.naturalWidth;
  h = oImg.naturalHeight;
} else {
  // IE 6/7/8
  var nImg = new Image();
//      nImg.src = oImg.src;
  nImg.onload = function () {
    w = nImg.width;
    h = nImg.height;
    console.log(w + "  " + h)
  }
  nImg.src = oImg.src;
}

此时为什么要加 onload 的原因是,图片可能没加载完成,导致图片的 width 、height 无法获取到。

这里还有有个点要注意, nImg.src = oImg.src 这段代码为什么要放在 nImg.onload 函数后面? 这样做是为了兼容 ie 。ie 除了第一次加载图片时候获取正常,之后再刷新就没有反应了。其他大部分浏览器获取正常。这是什么原因呢?

原因也挺简单的,就是因为浏览器的缓存了。当图片加载过一次以后,如果再有对该图片的请求时,由于浏览器已经缓存住这张图片了,不会再发起一次新的请求,而是直接从缓存中加载过来。对于大部分浏览器,它们视图使这两种加载方式对用户透明,同样会引起图片的onload事件,而 ie 则忽略了这种同一性,不会引起图片的onload事件。。。一般情况下,可以用 complete 来判断图片是否加载完毕。对于 complete 属性来讲,IE是根据图片是否显示过来判断,就是说当加载的图片显示出来后,complete 属性的值才为true ,否则一直是false ,和以前是否加载过该张图片没有关系,即和缓存没有关系!可以写如下的函数来做到各个浏览器中预加载图片的兼容性。如下:

var img = document.getElementById("oImg"),
      w,h;

if (oImg.naturalWidth) {
  // HTML5 browsers
  w = oImg.naturalWidth;
  h = oImg.naturalHeight;
} else {
  // IE 6/7/8
  var nImg = new Image();
  nImg.src = oImg.src;
  if(nImg.complete) { // 图片已经存在于浏览器缓存
    console.log(nImg.width + "  " + nImg.height);
  }else{
    nImg.onload = function () {
      w = nImg.width;
      h = nImg.height;
      console.log(w + "  " + h);
    }
  }
}

最后封装成函数,如下:

function getImgNaturalDimensions(oImg, callback) {
  var nWidth, nHeight;
  if (!oImg.naturalWidth) { // 现代浏览器

    nWidth = oImg.naturalWidth;
    nHeight = oImg.naturalHeight;
    callback({w: nWidth, h:nHeight});

  } else { // IE6/7/8
    var nImg = new Image();

        nImg.onload = function() {
             var nWidth = nImg.width,
                 nHeight = nImg.height;
           callback({w: nWidth, h:nHeight});
    }
    nImg.src = oImg.src;
  }
}

var img = document.getElementById("oImg"); getImgNaturalDimensions(img, function(dimensions){   console.log(dimensions.w); });

方法二:(图片不需要再页面中展示)

将 img 放在页面中不可见的位置上,缺点是:这种方法需要浏览器加载这张图片

.imgbox{// img 盒子
   0;
  overflow: hidden;
}

然后在去取图片宽高等信息:

function getImgNaturalDimensions2(oImg) {
  var nWidth, nHeight;
  if (!oImg.naturalWidth) { // 现代浏览器
  nWidth = oImg.naturalWidth;
  nHeight = oImg.naturalHeight;
  return ({w: nWidth, h:nHeight});
} else { // IE6/7/8
    nWidth = oImg.width;
    nHeight = oImg.height;
    return ({w: nWidth, h:nHeight});
  }
}

var getImg = getImgNaturalDimensions2(img);
console.log(getImg)

然而,到这里,是不是万事大吉了呢?答案当然是否定的。

你用这种方法做后,会发现你有时可以取得 img 的 width、height ,但有时会是个 0。原因见下节分析。

我们先看如何正常去取吧!

var img = document.getElementById("oImg");


img.onload = function(){
    //方法一
    getImgNaturalDimensions(img, function(dimensions){
        console.log(dimensions.w);
    });

    //方法二
    var getImg = getImgNaturalDimensions2(img);
    console.log(getImg);
}

只需在 img.onload 函数内去调用函数。

原因见下节分析:js获取图片信息(二)-----js获取img的height、width宽高值为0

免责声明:文章转载自《js获取图片信息(一)-----获取图片的原始尺寸》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Hadoop源码分析5: RPC基本线程SQL Server服务启动时错误:1069(由于登陆失败而无法启动服务)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

NodeJS服务器退出:完成任务,优雅退出

上一篇文章,我们通过一个简单的例子,学习了NodeJS中对客户端的请求(request)对象的解析和处理,整个文件共享的功能已经完成。但是,纵观整个过程,还有两个地方明显需要改进: 首先,不能共享完毕之后,都通过Ctrl+C来关闭NodeJS服务器。 其次,如果仅仅能向客户端提供d:ilinkit_logo.png文件的下载,是没有意义的,共享哪个文件,应...

JS的"多线程"

这个系列的文章名为“JavaScript 进阶”,内容涉及JS中容易忽略但是很有用的,偏JS底层的,以及复杂项目中的JS的实践。主要来源于我几年的开发过程中遇到的问题。小弟第一次写博客,写的不好的地方请诸位斧正,觉得还有一些阅读价值的请帮忙分享下。这个“JavaScript 进阶”是一个系列文章,请大家鼓励鼓励,我尽快更新。另外,如果你有比较好的话题,也可...

docker 日志在常见系统中的查看方法

1、查看docker日志的方法: 1) ubuntu(14.04)   /var/log/upstart/docker.log 2) ubuntu(16.04)   journalctl -u docker.service 3) centos7/rhel7     journalctl -u docker.service 4) coreos        ...

使用apt-mirror建立局域网内的Debian/Ubuntu源镜像

转:http://forum.ubuntu.org.cn/viewtopic.php?t=41791 第一次翻译,翻译得不好还请大家见谅,多多指出错误~!:) 原文可以见如下的贴子:http://forum.ubuntu.org.cn/viewtopic.php?t=40082&highlight=%E7%BF%BB%E8%AF%91 使用apt...

防止表单重复提交的方法

1、在jsp页面的button添加相关js代码: <input type="button" value="提交" onclick="this.disabled=true;this.form.submit()"> 此方法缺点是用户可能禁用js,此方法就可能失效。 2、session的token机制...

js布尔类型

<!--禁用--> <inputtype="text" disabled> <!--只读--> <inputtype="text" readonly> <!--多选--> <inputtype="file"multiple> <!--默认选中--> <inputty...