2008年10月11日
JavaScriptで画像の本来の幅と高さを取得する
img要素のwidthプロパティとheightプロパティを参照すれば、画像の幅と高さを取得することができます。しかし、ここで取得できる値はHTMLの<img>タグ中のwidthとheightで指定した数値であり、画像の本来の幅と高さではありません(widthとheightが指定されていない場合は自動的に画像本来のサイズになりますが)。では、画像の本来の幅と高さを知りたい場合はどうするか。
FirefoxやSafariの場合、imgオブジェクトにはnaturalWidthとnaturalHeightというプロパティが設定されていて、これを参照すれば画像のもともとのサイズが取得できるようです(Fx3.0.3、Safari3.1.2で確認)。
<!-- 幅100px、高さ80pxの「foo.jpg」という画像を幅50px、高さ40pxのサイズ指定で表示 --> <img id="img1" src="foo.jpg" width="50" height="40" /> <script type="text/javascript"> Event.observe(window, 'load', function() { var img1 = $('img1'); alert(img1.width + '*' + img1.height); // 50*40(HTML中で指定したサイズ) alert(img1.naturalWidth + '*' + img1.naturalHeight); // 100*80(本来のサイズ) </script>
ブラウザによって画像の読み込みが完了するタイミングはまちまちのようなので、上記のようにloadが完了してからプロパティを参照するようにしたほうが無難です(参考:Safariでは画像のloadが終わっていないとwidth、heightがうまく取得できない at HouseTect, JavaScriptな情報をあなたに)。
ただしこのプロパティはIEでは使えないので、IEの場合は新しいImageオブジェクトを生成してそのオブジェクトのプロパティから幅と高さを取得します。
var newImg = new Image(); newImg.src = 'foo.jpg'; Event.observe(newImg, 'load', function() { alert(newImg.width + '*' + newImg.height); // 100*80 });
この場合も、やはりロードを待ってからプロパティを見に行くようにしたほうが安全です。
10/21追記:
これを使って簡単に画像サイズの指定をチェックするGreasemonkeyスクリプトを作ってみました。こちらもどうぞ。⇒画像のサイズ指定違いを可視化するGreasemonkeyスクリプト - inamenaiの日記
トラックバック - http://d.hatena.ne.jp/inamenai/20081011/p1
リンク元
- 425 http://js.designlinkdatabase.net/data/204859.aspx
- 277 http://b.hatena.ne.jp/hotentry
- 243 http://reader.livedoor.com/reader/
- 217 http://js.designlinkdatabase.net/data/frame_204859.aspx
- 214 http://d.hatena.ne.jp/uupaa/20090602/1243933843
- 176 http://www.google.co.jp/search?q=javascript+画像の幅&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox
- 163 http://www.google.co.jp/search?hl=ja&q=javascript+画像&lr=
- 153 http://search.yahoo.co.jp/search?p=javascript+画像 取得&ei=UTF-8&fr=top_ga1&x=wrt&meta=vc=
- 151 http://d.hatena.ne.jp/
- 116 http://www.google.co.jp/url?sa=t&rct=j&q=javascript 画像の高さ&source=web&cd=1&ved=0CCIQFjAA&url=http://d.hatena.ne.jp/inamenai/20081011/p1&ei=elKETpTqAYP6mAXip_El&usg=AFQjCNHHuhP7-RlrFKNO712vLIZe3yqRMQ&sig
