取得圖片原來的大小

來源:互聯網
上載者:User

如果是在預先載入的情況下,即沒有把圖片插入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;         }

<br /><!doctype html><br /><html><br /> <head><br /> <title>預先載入圖片 by 司徒正美 </title></p><p> <style><br /> #image {<br /> width:200px;<br /> height:200px;<br /> }<br /> </style><br /> <script></p><p> function loadImage(url, callback) {<br /> var img = new Image();<br /> img.onload = function(){<br /> img.onload = null;<br /> callback.call(img,img.width,img.height)<br /> }<br /> img.src = url;<br /> }<br /> loadImage("http://images.cnblogs.com/cnblogs_com/rubylouvre/199042/o_005.jpg",function(w,h){<br /> alert([w,h])<br /> })<br /> </script><br /> </head><br /> <body></p><p> </body><br /></html><br />

運行代碼

但如果在DOM樹建完之後,取得某一圖片原來的尺寸,在safari,firefox,chrome,與opera10+中,有兩個便捷的屬性(naturalWidth,naturalHeight)可以做到這一點。

<br /><!doctype html><br /><html><br /> <head><br /> <title>擷取圖片原來的尺寸 by 司徒正美</title><br /> <script><br /> window.onload = function(){<br /> var img = document.getElementById("img");<br /> alert(img.width + '*' + img.height); // 真實應用到的尺寸<br /> alert(img.naturalWidth + '*' + img.naturalHeight); // 原來的尺寸<br /> }<br /> </script><br /> <style><br /> div {<br /> width: 200px;<br /> height: 200px;<br /> }<br /> div img{<br /> border: 3px solid salmon;<br /> margin: 2pt;<br /> width: 87%;<br /> height: 9em;<br /> }<br /> </style><br /> </head><br /> <body><br /> <div><br /> <img src="http://images.cnblogs.com/cnblogs_com/rubylouvre/199042/o_005.jpg" id="img" /><br /> </div><br /> </body><br /></html></p><p>

運行代碼

對於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};      }

<br /><!doctype html><br /><html><br /> <head><br /> <title>擷取圖片原來的尺寸 by 司徒正美</title><br /> <script></p><p> function getActualSize(img){<br /> var testee = new Image;//弄一個替身<br /> testee.style.position = 'absolute';<br /> testee.style.visibility = 'hidden';<br /> testee.style.top = testee.style.left = '0px';<br /> document.body.appendChild(testee);<br /> testee.src = img.src;<br /> var width = testee.width;<br /> var height = testee.height;<br /> testee.parentNode.removeChild(testee);<br /> return {width:width, height:height};<br /> }</p><p> window.onload = function(){<br /> var img = document.getElementById("img");<br /> var size = getActualSize(img);<br /> alert([size.width,size.height])<br /> }</p><p> </script><br /> <style><br /> div {<br /> width: 200px;<br /> height: 200px;<br /> }<br /> div img{<br /> border: 3px solid salmon;<br /> margin: 2pt;<br /> width: 87%;<br /> height: 9em;<br /> }<br /> </style><br /> </head><br /> <body><br /> <div><br /> <img src="http://images.cnblogs.com/cnblogs_com/rubylouvre/199042/o_005.jpg" id="img" /><br /> </div><br /> </body><br /></html><br />

運行代碼

此法雖然因為緩衝而不會再發請求,但需要多建立一個元素作為測量對象,開銷比較大。有沒有更好的辦法呢?我們可以考慮一下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};      }

<br /><!doctype html><br /><html><br /> <head><br /> <title>擷取圖片原來的尺寸 by 司徒正美</title><br /> <script></p><p> function getActualSize(img) {<br /> var run = img.runtimeStyle;<br /> var mem = { w: run.width, h: run.height }; //儲存原來的尺寸<br /> run.width = run.height = "auto";//重寫<br /> var w = img.width;//取得現在的尺寸<br /> var h = img.height;<br /> run.width = mem.w; //還原<br /> run.height = mem.h;<br /> return {width:w, height:h};<br /> }</p><p> window.onload = function(){<br /> var img = document.getElementById("img");<br /> var size = getActualSize(img);<br /> alert([size.width,size.height])<br /> }</p><p> </script><br /> <style><br /> div {<br /> width: 200px;<br /> height: 200px;<br /> }<br /> div img{<br /> border: 3px solid salmon;<br /> margin: 2pt;<br /> width: 87%;<br /> height: 9em;<br /> }<br /> </style><br /> </head><br /> <body><br /> <div><br /> <img src="http://images.cnblogs.com/cnblogs_com/rubylouvre/199042/o_005.jpg" id="img" /><br /> </div><br /> </body><br /></html><br />

運行代碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.