画像クロスブラウザの元のサイズを決定しますか?


90

<img src='xyz.jpg'>クライアント側でサイズ変更の物理的な寸法を決定する、信頼できるフレームワークに依存しない方法はありますか?


img.onload = function () {console.log(img.height, img.width)}
neaumusic

回答:


130

次の2つのオプションがあります。

オプション1:

widthおよびheight属性を削除し、読み取りoffsetWidthおよびoffsetHeight

オプション2:

JavaScriptの作成Imageオブジェクトを、設定src、および読みwidthheight(あなたもこれを行うには、それをページに追加する必要はありません)。

function getImgSize(imgSrc) {
    var newImg = new Image();

    newImg.onload = function() {
      var height = newImg.height;
      var width = newImg.width;
      alert ('The image size is '+width+'*'+height);
    }

    newImg.src = imgSrc; // this must be done AFTER setting onload
}

Pekkaによる編集:コメントで合意したように、画像の「onload」イベントで実行するように関数を変更しました。そうでなければ、大きな画像で、heightそしてwidthイメージがまだロードされていなかったため、何も返しません。


これは、まだ読み込まれていない画像では機能しません。他の人がこの答えに出くわしたときに適切に機能するように調整する価値があるかもしれません。
ジェームズ

11
@Gabriel、私はこれを使用していますがnewImg.onload、幅/高さを設定したときに画像が確実に読み込まれるようにする機能を備えています。それに応じて回答を編集してもよろしいですか?
Pekka

2
余談ですが、Chrome / OSXでは、この手法を使用して高さ/幅として0を取得すると、キャッシュされた画像で問題が発生する可能性があります。
David Hellsing

2
どのように私はリターンの高さと幅を得ることができます... ?? これらの変数はonloadの外に出ていないので
ジャック

5
@GabrielMcAdams、if(newImg.complete || newImg.readyState === 4) newImg.onload();関数の最後に追加すると、画像がキャッシュから読み込まれたときにonloadが起動しないというChrome / OSXの問題が修正されます。
Prestaul

101

画像(少なくともFirefox上)にはnaturalWidth/ heightプロパティimg.naturalWidthがあり、元の幅を取得するために使用できます

var img = document.getElementsByTagName("img")[0];
img.onload=function(){
    console.log("Width",img.naturalWidth);
    console.log("Height",img.naturalHeight);
}

ソース


8
Chromeでも動作
bcoughlan

4
このトピックは2013年にも関連があります。IE7
and

4
これが2018年の勝利の答えです。(MDNのブラウザごとの互換性テーブル
7vujy0f0hy

3

画像をjavascript Imageオブジェクトにプリロードしてから、そのオブジェクトのwidthプロパティとheightプロパティを確認できます。


もちろん-私はそれをドキュメントに入れる必要はありません。そのようにやります、乾杯!
Pekka、

3
/* Function to return the DOM object's in crossbrowser style */
function widthCrossBrowser(element) {
    /* element - DOM element */

    /* For FireFox & IE */
    if(     element.width != undefined && element.width != '' && element.width != 0){
        this.width  =   element.width;
    }
    /* For FireFox & IE */
    else if(element.clientWidth != undefined && element.clientWidth != '' && element.clientWidth != 0){
        this.width  =   element.clientWidth;
    }
    /* For Chrome * FireFox */
    else if(element.naturalWidth != undefined && element.naturalWidth != '' && element.naturalWidth != 0){
        this.width  =   element.naturalWidth;
    }
    /* For FireFox & IE */
    else if(element.offsetWidth != undefined && element.offsetWidth != '' && element.offsetWidth != 0){
        this.width  =   element.offsetWidth;
    }       
        /*
            console.info(' widthWidth width:',      element.width);
            console.info(' clntWidth clientWidth:', element.clientWidth);
            console.info(' natWidth naturalWidth:', element.naturalWidth);
            console.info(' offstWidth offsetWidth:',element.offsetWidth);       
            console.info(' parseInt(this.width):',parseInt(this.width));
        */
    return parseInt(this.width);

}   

var elementWidth    = widthCrossBrowser(element);

あるelementjQueryの選択は?高さはどうですか?
Istiaque Ahmed

2

ガブリエルの2番目のオプションを少し変更して、より使いやすくします。

function getImgSize(imgSrc, callback) {
    var newImg = new Image();

    newImg.onload = function () {
        if (callback != undefined)
            callback({width: newImg.width, height: newImg.height})
    }

    newImg.src = imgSrc;
}

HTML:

<img id="_temp_circlePic" src="http://localhost/myimage.png" 
style="width: 100%; height:100%">

呼び出しの例:

getImgSize($("#_temp_circlePic").attr("src"), function (imgSize) {
    // do what you want with the image's size.
    var ratio = imgSize.height / $("#_temp_circlePic").height();
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.