Ruby's Louvre

每天学习一点点算法

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

取得图片原来的大小

如果是在预加载的情况下,即没有把图片插入DOM树,它没有受到CSS规则的影响,直接取其img.width与img.height就行了。可以参考〈a href="http://www.cnblogs.com/rt0d/archive/2011/04/17/2018646.html"〉这一篇博文,做得相当棒了。

function loadImage(url, callback) {
    var img = new Image();
    img.onload = function(){
      img.onload = null;
      callback.call(img,img.width,img.height)
    }
    img.src = url;
  }

但如果在DOM树建完之后,取得某一图片原来的尺寸,在safari,firefox,chrome,与opera10+中,有两个便捷的属性(naturalWidth,naturalHeight)可以做到这一点。

对于IE与opera的早期版本,就没有这么幸运了,我们需要转换视角,从求当前图片的原来尺寸,变为求另一个同URL的图片的尺寸

function getActualSize(img){
   var testee = new Image;//弄一个替身
   testee.style.position = 'absolute';
   testee.style.visibility = 'hidden';
   testee.style.top =  testee.style.left = '0px';
   document.body.appendChild(testee);
   testee.src = img.src;
   var width = testee.width;
   var height = testee.height;
   testee.parentNode.removeChild(testee);
   return {width:width, height:height};
 }

此法虽然因为缓存而不会再发请求,但需要多创建一个元素作为测量对象,开销比较大。有没有更好的办法呢?我们可以考虑一下IE的那三组样式属性了,style,currentStyle与runtimeStyle。眼下,我们只需用到runtimeStyle。它有个特点是,不用同步style就能重绘原来的元素。我们可以直接在runtimeStyle进行设置,然后取得相关值,再重置回去就行了。

function getActualSize(img) {
  var run = img.runtimeStyle;
  var mem = { w: run.width, h: run.height }; //保存原来的尺寸
  run.width  = run.height = "auto";//重写
  var w = img.width;//取得现在的尺寸
  var h = img.height;
  run.width  = mem.w; //还原
  run.height = mem.h;
  return {width:w, height:h};
}

如果您觉得此文有帮助,可以打赏点钱给我支付宝1669866773@qq.com ,或扫描二维码

posted on   司徒正美  阅读(5623)  评论(9编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示