js获取图片宽高的方法


Posted in Javascript onNovember 25, 2015

本文分享多种js获取图片宽高的方法,并且通过实例进行分析,希望大家从中有所收获。

一、简陋的获取图片方式

// 图片地址 后面加时间戳是为了避免缓存
var img_url = ‘upload/2013/13643608813441.jpg?'+Date.parse(new Date());
 
// 创建对象
var img = new Image();
 
// 改变图片的src
img.src = img_url;
 
// 打印
alert('width:'+img.width+',height:'+img.height);

 结果如下:

js获取图片宽高的方法

宽高都是0的这个结果很正常,因为图片的相关数据都没有被加载前它的宽高默认就是0 于是可以这么优化!

二、onload后在打印

// 图片地址 后面加时间戳是为了避免缓存
var img_url = 'upload/2013/13643608813441.jpg?'+Date.parse(new Date());
 
// 创建对象
var img = new Image();
 
// 改变图片的src
img.src = img_url;
 
// 加载完成执行
img.onload = function(){
 // 打印
 alert('width:'+img.width+',height:'+img.height);
};

 结果如下

js获取图片宽高的方法

通过onload就能获取到图片的宽高了。但onload大一点的图通常都比较慢,不实用,但只要图片被浏览器缓存,那么图片加载几乎就不用等待即可触发onload,我们要的是占位符。所以有些人通过缓存获取也可以这么写。

三、通过complete与onload一起混合使用
为了测试缓存效果,注意以下测试图片的url都不加时间戳

// 图片地址
var img_url = 'upload/2013/13643608813441.jpg';
 
// 创建对象
var img = new Image();
 
// 改变图片的src
img.src = img_url;
 
// 判断是否有缓存
if(img.complete){
 // 打印
 alert('from:complete : width:'+img.width+',height:'+img.height);
}else{
 // 加载完成执行
 img.onload = function(){
 // 打印
 alert('from:onload : width:'+img.width+',height:'+img.height);
 };
}

 第一次执行,永远是onload触发

js获取图片宽高的方法

你再刷新,几乎都是缓存触发

js获取图片宽高的方法

从缓存里读取图片的宽高不用说,非常方便快捷,今天我们要解决的是没有缓存而又快速的相比onload更快的方式去获取图片的宽高。我们常常知道有些图片虽然没有完全down下来,但是已经先有占位符,然后一点一点的加载。既然有占位符那应该是请求图片资源服务器响应后返回的。可服务器什么时候响应并返回宽高的数据没有触发事件,比如onload事件。于是催生了第四种方法

四、通过定时循环检测获取
看看以下例子,为了避免从缓存里读取数据,每一次请求都带时间戳:

// 图片地址
var img_url = 'upload/2013/13643608813441.jpg?'+Date.parse(new Date());
 
// 创建对象
var img = new Image();
 
// 改变图片的src
img.src = img_url;
 
// 定时执行获取宽高
var check = function(){
 document.body.innerHTML += '
from:check : width:'+img.width+',height:'+img.height+'
';
};
 
var set = setInterval(check,40);
 
// 加载完成获取宽高
img.onload = function(){
 document.body.innerHTML += '
from:onload : width:'+img.width+',height:'+img.height+'
';
 
 // 取消定时获取宽高
 clearInterval(set);
};

 FireFox

js获取图片宽高的方法

IE7 8 9 10

js获取图片宽高的方法

Chrome

js获取图片宽高的方法

通过以上测试,我们发现定时检测图片宽高的方式要比onload快多了,打印的行数越多表示onload时间越长,40毫秒执行一次,基本100毫秒内就能获取图片的宽高,chrome甚至在第一次循环的时候就已经获得数据。从以上数据来分析,其实我们可以在定时函数里判断只要图片的宽高都大于0就表示已经获得正确的图片宽高。我们把时间打上,来看看通过定时获取宽高或者onload获取宽高所需要多少时间。

// 记录当前时间戳
var start_time = new Date().getTime();
 
// 图片地址
var img_url = 'http://b.zol-img.com.cn/desk/bizhi/image/2/2560x1600/1365477614755.jpg?'+start_time;
 
// 创建对象
var img = new Image();
 
// 改变图片的src
img.src = img_url;
 
// 定时执行获取宽高
var check = function(){
 // 只要任何一方大于0
 // 表示已经服务器已经返回宽高
 if(img.width>0 || img.height>0){
 var diff = new Date().getTime() - start_time;
 document.body.innerHTML += '
from:check : width:'+img.width+',height:'+img.height+', time:'+diff+'ms
';
 clearInterval(set);
 }
};
 
var set = setInterval(check,40);
 
// 加载完成获取宽高
img.onload = function(){
 var diff = new Date().getTime() - start_time;
 document.body.innerHTML += 'from:onload : width:'+img.width+',height:'+img.height+', time:'+diff+'ms';
};

 FireFox:

js获取图片宽高的方法

IE

js获取图片宽高的方法

Chrome

js获取图片宽高的方法

这是一张2560 * 1600大小的图片,各浏览器执行结果都能看到通过快速获取图片大小的方法几乎都在200毫秒以内,而onload至少五秒以上,这差别之大说明快速获取图片宽高非常实用。

通过大量实例分析比较了js获取图片宽高各种方法的优劣,希望大家根据需要认真取舍。

Javascript 相关文章推荐
jQuery div层的放大与缩小简单实现代码
Mar 28 Javascript
js动态生成指定行数的表格
Jul 11 Javascript
Jquery Ajax解析XML数据(同步及异步调用)简单实例
Feb 12 Javascript
js中精确计算加法和减法示例
Mar 28 Javascript
jQuery中data()方法用法实例
Dec 27 Javascript
js实现最短的XML格式化工具实例
Mar 12 Javascript
javascript新闻跑马灯实例代码
Jul 29 Javascript
微信小程序实现bindtap等事件传参
Apr 08 Javascript
对layui初始化列表的CheckBox属性详解
Sep 13 Javascript
vue解决花括号数据绑定不成功的问题
Oct 30 Javascript
纯JS实现五子棋游戏
May 28 Javascript
react的hooks的用法详解
Oct 12 Javascript
javascript数据结构之二叉搜索树实现方法
Nov 25 #Javascript
javascript常用经典算法实例详解
Nov 25 #Javascript
javascript实现很浪漫的气泡冒出特效
Sep 05 #Javascript
jQuery插件jquery-barcode实现条码打印的方法
Nov 25 #Javascript
JavaScript编写简单的计算器
Nov 25 #Javascript
HTML5 Shiv完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
Nov 25 #Javascript
jQuery插件formValidator自定义函数扩展功能实例详解
Nov 25 #Javascript
You might like
eaglephp使用微信api接口开发微信框架
2014/01/09 PHP
Linux下从零开始安装配置Nginx服务器+PHP开发环境
2015/12/21 PHP
php5.4传引用时报错问题分析
2016/01/22 PHP
PHP实现的方程求解示例分析
2016/11/11 PHP
php操作redis数据库常见方法实例总结
2020/02/20 PHP
gearman中任务的优先级和返回状态实例分析
2020/02/27 PHP
js setTimeout 参数传递使用介绍
2013/08/13 Javascript
引用 js在IE与FF之间的区别详细解析
2013/11/20 Javascript
控制文字内容的显示与隐藏示例
2014/06/11 Javascript
javascript+ajax实现产品页面加载信息
2015/07/09 Javascript
TypeScript Type Innference(类型判断)
2016/03/10 Javascript
ES6中的数组扩展方法
2016/08/26 Javascript
利用Angularjs和Bootstrap前端开发案例实战
2016/08/27 Javascript
使用node.js对音视频文件加密的实例代码
2017/08/30 Javascript
React-Native中禁用Navigator手势返回的示例代码
2017/09/09 Javascript
通过JQuery,JQueryUI和Jsplumb实现拖拽模块
2019/06/18 jQuery
JavaScript实现多层颜色选项卡嵌套
2020/09/21 Javascript
[03:14]辉夜杯主赛事 12月25日每日之星
2015/12/26 DOTA
python使用PyGame绘制图像并保存为图片文件的方法
2015/04/24 Python
python3获取url文件大小示例代码
2019/09/18 Python
python数据预处理 :数据抽样解析
2020/02/24 Python
Python爬取微信小程序Charles实现过程图解
2020/09/29 Python
python实现定时发送邮件到指定邮箱
2020/12/23 Python
Ubuntu20.04环境安装tensorflow2的方法步骤
2021/01/29 Python
美国在线精品家居网站:Burke Decor
2017/04/12 全球购物
Molly Bracken法国电子商店:法国女性时尚品牌
2019/07/24 全球购物
体育节口号
2014/06/19 职场文书
会员活动策划方案
2014/08/19 职场文书
个人先进事迹材料
2014/12/29 职场文书
党风廉政建设调研报告
2015/01/01 职场文书
事业单位年度考核个人总结
2015/02/12 职场文书
主持稿开场白
2015/06/01 职场文书
《我的伯父鲁迅先生》教学反思
2016/02/16 职场文书
导游词之贵州百里杜鹃
2019/10/29 职场文书
Mysql 如何查询时间段交集
2021/06/08 MySQL
SpringBoot2 参数管理实践之入参出参与校验的方式
2021/06/16 Java/Android