JS中通过url动态获取图片大小的方法小结(两种方法)


Posted in Javascript onOctober 31, 2018

很多时候再项目中,我们往往需要先获取图片的大小再加载图片,但是某些特定场景,如用过cocos2d-js的人都知道,在它那里只能按比例缩放大小,是无法设置指定大小的图片的,这就是cocos2d-js 的坑了,我们必须先获取图片大小,计算比例再对图片进行缩放。

查阅资料,我总结了两种通过url获取图片大小的方法:

1.预加载获取图片大小

var imgLoad = function (url, callback) {
  var img = new Image();
  img.src = url;
  if (img.complete) {
    callback(img.width, img.height);
  } else {
    img.onload = function () {
      callback(img.width, img.height);
      img.onload = null;
    };
  };
};

此方法必须等待图片加载完毕才能获取尺寸,速度超慢,图片会先出现原本大小,一段时间后才进行缩放,体验差

2.封装的方法imgReady

var imgReady = (function () {
  var list = [], intervalId = null,
  // 用来执行队列
  tick = function () {
    var i = 0;
    for (; i < list.length; i++) {
      list[i].end ? list.splice(i--, 1) : list[i]();
    };
    !list.length && stop();
  },
  // 停止所有定时器队列
  stop = function () {
    clearInterval(intervalId);
    intervalId = null;
  };
  return function (url, ready, load, error) {
    var onready, width, height, newWidth, newHeight,
    img = new Image();
    img.src = url;
    // 如果图片被缓存,则直接返回缓存数据
    if (img.complete) {
      ready.call(img);
      load && load.call(img);
      return;
    };
    width = img.width;
    height = img.height;
    // 加载错误后的事件
    img.onerror = function () {
      error && error.call(img);
      onready.end = true;
      img = img.onload = img.onerror = null;
    };
    // 图片尺寸就绪
    onready = function () {
      newWidth = img.width;
      newHeight = img.height;
      if (newWidth !== width || newHeight !== height ||newWidth * newHeight > 1024) {
      // 如果图片已经在其他地方加载可使用面积检测
        ready.call(img);
        onready.end = true;
      };
    };
    onready();
    // 完全加载完毕的事件
    img.onload = function () {
      // onload在定时器时间差范围内可能比onready快
      // 这里进行检查并保证onready优先执行
      !onready.end && onready();
      load && load.call(img);
      // IE gif动画会循环执行onload,置空onload即可
      img = img.onload = img.onerror = null;
    };
    // 加入队列中定期执行
    if (!onready.end) {
      list.push(onready);
      // 无论何时只允许出现一个定时器,减少浏览器性能损耗
      if (intervalId === null) intervalId = setInterval(tick, 40);
    };
  };
})();

方法调用:

imgReady('http://www.google.com.hk/intl/zh-CN/images/logo_cn.png', function () {
  alert('size ready: width=' + this.width + '; height=' + this.height);
});

方法二体验下好很多,速度也很快,建议使用。

总结

以上所述是小编给大家介绍的JS中通过url动态获取图片大小的方法小结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript 解析读取XML文档 实例代码
Jul 07 Javascript
boxy基于jquery的弹出层对话框插件扩展应用 弹出层选择器
Nov 21 Javascript
页面装载js及性能分析方法介绍
Mar 21 Javascript
JavaScript也谈内存优化
Jun 06 Javascript
js识别不同浏览器基于userAgent做判断
Jul 29 Javascript
JavaScript图像延迟加载库Echo.js
Apr 05 Javascript
微信小程序 教程之注册页面
Oct 17 Javascript
js入门之Function函数的使用方法【新手必看】
Nov 22 Javascript
react-native 封装选择弹出框示例(试用ios&amp;android)
Jul 11 Javascript
React操作真实DOM实现动态吸底部的示例
Oct 23 Javascript
JavaScript反射与依赖注入实例详解
May 29 Javascript
关于vue3默认把所有onSomething当作v-on事件绑定的思考
May 15 Javascript
微信小程序实现留言功能
Oct 31 #Javascript
微信小程序签到功能
Oct 31 #Javascript
vue+element-ui实现表格编辑的三种实现方式
Oct 31 #Javascript
VUE+Element UI实现简单的表格行内编辑效果的示例的代码
Oct 31 #Javascript
微信小程序实现签到功能
Oct 31 #Javascript
vuejs+element UI点击编辑表格某一行时获取内容填入表单的示例
Oct 31 #Javascript
微信小程序实现自动定位功能
Oct 31 #Javascript
You might like
根德Grundig S400/S500/S700电路分析
2021/03/02 无线电
php过滤危险html代码
2008/08/18 PHP
PHP实现bitmap位图排序与求交集的方法
2016/07/28 PHP
yii2利用自带UploadedFile实现上传图片的示例
2017/02/16 PHP
PHP框架Laravel中实现supervisor执行异步进程的方法
2017/06/07 PHP
jQuery学习5 jQuery事件模型
2010/02/07 Javascript
5个JavaScript经典面试题
2014/10/13 Javascript
谈谈Jquery ajax中success和complete有哪些不同点
2015/11/20 Javascript
AngularJS Module方法详解
2015/12/08 Javascript
手机软键盘弹出时影响布局的解决方法
2016/12/15 Javascript
引入外部js脚本加载慢与页面白屏问题的解决
2018/12/10 Javascript
javascript实现搜索筛选功能实例代码
2020/11/12 Javascript
javascript实现移动端轮播图
2020/12/09 Javascript
[42:20]Winstrike vs VGJ.S 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
使用Python实现BT种子和磁力链接的相互转换
2015/11/09 Python
python通过elixir包操作mysql数据库实例代码
2018/01/31 Python
Scrapy框架使用的基本知识
2018/10/21 Python
selenium使用chrome浏览器测试(附chromedriver与chrome的对应关系表)
2018/11/29 Python
Django中reverse反转并且传递参数的方法
2019/08/06 Python
TensorFlow设置日志级别的几种方式小结
2020/02/04 Python
TensorFlow使用Graph的基本操作的实现
2020/04/22 Python
python如何使用代码运行助手
2020/07/03 Python
Python+Kepler.gl实现时间轮播地图过程解析
2020/07/20 Python
Tensorflow使用Anaconda、pycharm安装记录
2020/07/29 Python
基于Python的图像阈值化分割(迭代法)
2020/11/20 Python
详解pandas映射与数据转换
2021/01/22 Python
Feelunique德国官方网站:欧洲最大的在线美容零售商
2019/07/20 全球购物
职高毕业生自我鉴定
2013/10/21 职场文书
大学系主任推荐信范文
2013/12/24 职场文书
企业为何需要商业计划书
2013/12/26 职场文书
《我为你骄傲》教学反思
2014/02/20 职场文书
质量月活动策划方案
2014/03/10 职场文书
《山中访友》教学反思
2016/02/24 职场文书
python绘制箱型图
2021/04/27 Python
pytorch 如何使用float64训练
2021/05/24 Python
MySQL 原理与优化之Update 优化
2022/08/14 MySQL