js獲取圖片信息(一)-----獲取圖片的原始尺寸


如何獲取圖片的原始尺寸大小?

  如下,當給 img 設置一個固定的大小時,要怎樣獲取圖片的原始尺寸呢?

#oImg{
    width: 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 盒子   width: 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獲取圖片信息(一)-----獲取圖片的原始尺寸


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM