質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Cordova

Cordovaは様々なデバイスで使うことができるオープンソースなモバイル用開発プラットフォームです。開発者に各デバイスの元のプラットフォームで開発する必要をなくし、HTML・JavaScript・CSSなどの一般的なウェブのテクノロジーを使ってすべてのデバイスで展開することができるモバイルのアプリケーションを生成することを可能にします。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Monaca

「Monaca」はiOS、Android、Windows向けのアプリ開発に対応した、Cordovaベースのモバイルアプリ開発プラットフォームです。HTML5、JavaScriptといったWeb標準技術を用いてモバイルアプリ開発を行うことができます。

Q&A

解決済

5回答

7437閲覧

JavaScript(jQuery)で画像のオリジナルサイズを取得したい

agepan

総合スコア66

Cordova

Cordovaは様々なデバイスで使うことができるオープンソースなモバイル用開発プラットフォームです。開発者に各デバイスの元のプラットフォームで開発する必要をなくし、HTML・JavaScript・CSSなどの一般的なウェブのテクノロジーを使ってすべてのデバイスで展開することができるモバイルのアプリケーションを生成することを可能にします。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Monaca

「Monaca」はiOS、Android、Windows向けのアプリ開発に対応した、Cordovaベースのモバイルアプリ開発プラットフォームです。HTML5、JavaScriptといったWeb標準技術を用いてモバイルアプリ開発を行うことができます。

0グッド

1クリップ

投稿2018/04/27 08:49

編集2018/04/28 03:45

現在Monacaを使ってアプリを開発しております。

アプリの中で画像のオリジナルサイズを取得したいと思い、以下のコードにて試していますが、正しい画像サイズを取得できません。

JAVAScript

1 2var array = ['image01.jpg''image02.jpg''image03.jpg']; 3 4for (var i = 0; i < array.length; i++) { 5 6 var path = array[i]; 7 var image = new Image(); 8 9 image.onload = function () { 10 var imageWidth = image.width ; 11 var imageHeight = image.height ; 12 } 13 14 image.src = path; 15 16 alert(imageWidth + 'x' + imageHeight); 17}

実際の画像サイズは2000x1500pxであるにもかかわらず、上記コードを用いて取得した結果は1124x1999pxとなり、画角も異なります(この値は画像によって異なります)。

iPhoneで動作確認を行っているのですが、iPhoneの画面画角に変形されているようにも思えますが、これも画像によって異なります。正しい画像サイズを取得できる方法お分かりの方いらっしゃいましたらよろしくお願いいたします。

コードを書くにあたって参考にしたページはこちらです。
https://lab.syncer.jp/Web/JavaScript/Snippet/35/

追記

上記コードになる前に書いていたのが下記のコードです。

上記コードでは省いておりましたが、一連の画像を読み込む前に、別の画像(下記 画像A=「image_A.jpg」)を読み込んでおり、その次に上記コードと同じくfor文で画像(画像B=「image_B1〜B3.jpg」)を読み込んでいます。

画像Aは正しく読み込んで画像サイズを取得するのですが、その次の画像Bに関しては画像サイズが0となって正しく取得できません。

画像Bの方の変数名を変更しても同様で、同じようなコードなのになぜ画像Aが正しく読み込め、画像Bが正しく読めないのか分かりません。画像を何らか先に読み込む必要があるのか?と思い、調べて試してみたのが先に投稿しました上記のコードとなります。

Javascript

1// 画像Aの読み込み----------------------------------------------------------------------- 2 3var image = new Image(); 4 image.src = 'image_A.jpg'; 5var imageWidth = image.width; 6var imageHeight = image.height; 7 8alert(imageWidth + 'x' + imageHeight); // ←「2000x1500」など、正しい画像サイズを取得できる 9 10 11// 画像B1〜B3の読み込み------------------------------------------------------------------ 12 13var array = ['image_B1.jpg', 'image_B2.jpg', 'image_B3.jpg']; 14 15for (var j = 0; j < array.length; j++) { 16 17 var image = new Image(); // ←変数名を上と変えて「image2」としても「0」を取得します 18 image.src = array[j]; 19 var imageWidth = image.width; 20 var imageHeight = image.height; 21 22 alert(imageWidth + 'x' + imageHeight); // ←結果は「0x0」と画像サイズを取得できない 23 24} 25

追記2

先のコードを調整してみました。実際にはこれをfor文で囲み、複数画像を順繰りと舐めて画像サイズを取得したいと考えております。

JavaScript

1var image = new Image(); 2 image.src = 'image.jpg'; 3 image.onload = function (){ // 引数に「image」を入れても同じ 4 var imageWidth = image.naturalWidth; 5 var imageHeight = image.naturalHeight; 6 alert(imageWidth + 'x' + imageHeight); 7 } 8

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

turbgraphics200

2018/04/28 00:30

全角になっているところを半角に修正して。
kei344

2018/04/28 03:19

まだ質問が「受付中」になっていますが、「ベストアンサー」を選び「解決済」にされてはいかがでしょうか。
guest

回答5

0

ベストアンサー

js

1for (var i = 0; i < array.length; i++) { 2 3 var path = array[i]; 4 var image = new Image(); 5//... 6}

↑ループの周回ごとにimage変数が書き換えられます。
もしonloadイベントが起きる前にループが終わるなら、

js

1 image.onload = function () { 2 var imageWidth = image.width ; 3 var imageHeight = image.height ; 4 }

↑ここで参照しているimageは、想定しているものと異なっている可能性があります。

対策ですが、クロージャを作るか、letを使うなどしてブロックスコープを使うか、またはイベントターゲットの束縛を受けているthisを使ってみてください。

投稿2018/04/27 09:00

編集2018/04/27 09:04
Lhankor_Mhy

総合スコア36104

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

agepan

2018/04/28 00:13

ご回答ありがとうございます。 出力結果をよく確認すると、取得された正しくない画像サイズは、その前に読み込んでいた別の画像のサイズをそのまま引っ張ってきていることが原因だと分かりました。ご指摘の通り「image」が想定と違うものを読んでいたようです。コードを追記させていただきましたので、一度目を通して頂けますと幸いです。
Lhankor_Mhy

2018/04/28 00:23

追記のコードについては、ロードが終わっていないのが原因だと思います。頭書のコードのとおり、イベントを拾った方がよいのでは。 image_A.jpg が正しく取得されるのは、なぜなのか分かりませんが……
Lhankor_Mhy

2018/04/28 01:32

追記と同様のコードを試してみましたが、分かったことは以下のとおり。 ・Aのコードでも画像がキャッシュされていなければ、0x0になる。 ・Bのコードでも画像がキャッシュされていれば、サイズが表示される。 ・Bのコードでキャッシュされているものといないものを混在させると、キャッシュされているものだけサイズが表示される。 以上のとおり、追記のコードの現象はループ構造とは関係ないと思います。
agepan

2018/04/28 01:38

ありがとうございます、コメント拝見して気付きましたが、画像Aに関しては別画面で一旦読み込んでおりました。現在課題となっているのはそれとは別の画面での処理なのですが、おそらく画像Aは先に読んでいたキャッシュから画像サイズを取得し、どの画面でも読み込んでいなかった画像Bに関しては取得できなかった、ということだと思います。やはり画像が完全に読み込まれてからでないとサイズは取得できないようですね。
Lhankor_Mhy

2018/04/28 01:42

ご解決されたようで何よりです。 その他、ご不明な点があればコメントしてください。
agepan

2018/04/28 03:47

先のコードに戻るのですが、onloadで読み込んでから画像サイズを取得できるかなと思い、【追記2】のようなコードを書いたのですが、結果がundefinedとなってしまいます。このコードで問題ありそうな部分など分かりますでしょうか?
Lhankor_Mhy

2018/04/28 03:55

それは引数に「image」を入れた時だと思いますが、イベントハンドラの第1引数は event オブジェクトですから、想定されているようなオブジェクトを受け取ることはできません。繰り返しになりますが、this を使うなどしてください。または、event.targetでも動くかもしれません。
agepan

2018/04/28 04:35

「回答4」に記したコードに書き換えることで無事に取得できました!ありがとうございます! もう一つよければお尋ねしたいのですが、onloadで画像を読み込んでから画像サイズを取得する処理に入りますが、この処理が完了するのを待つことなく、後ろ(下)に書いている続きのコードが実行されてしまうのですが、画像サイズ取得完了してから続きに書いたコードを実行させるスマートな方法はあるんでしょうか?
Lhankor_Mhy

2018/04/28 04:40

それは難しいので、続きのコードを別の関数の中につめこんで、onloadのハンドラの中からその関数を呼び出して実行するようにするしかないと思います。
agepan

2018/04/28 04:44

なるほどやはりそうですか、では別関数化させて続きの処理をさせてみようと思います。どうもありがとうございました!
agepan

2018/05/10 12:39

ありがとうございます、参考になります。 Monacaの環境ですとiOSとAndroidで対応していれば大丈夫ですので、上記勉強させて頂きます!
guest

0

naturalHeight、naturalWidthプロパティを使ってください。https://developer.mozilla.org/ja/docs/Web/API/HTMLImageElement

投稿2018/04/27 08:54

編集2018/04/27 08:54
x_x

総合スコア13749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

agepan

2018/04/27 08:56

ご回答ありがとうございます。最初naturalWidth、naturalHeightを用いていたのですが、結果が変わりませんでしたので、いろいろいじって現在のimage.widthとimage.height指定に行き着いております。
x_x

2018/04/27 08:59

どういうコードを書いていたのでしょうか? 提示コードではそもそもエラーになって動かないのでは?
agepan

2018/04/28 00:14

コードを追記させていただきました。お目を通して頂けますと幸いです。
guest

0

Promise.all() を使え」といわれそうですが。

JavaScript

1'use strict'; 2const getImgNaturalSizeAll = (() => { 3 function handleLoad (event) { 4 const img = event.target, 5 map = this.map; 6 7 map.set(img.getAttribute('src'), {naturalWidth: img.naturalWidth, naturalHeight: img.naturalHeight}); 8 9 if (this.size === map.size) { 10 this.resolve(map); 11 } 12 } 13 14 return function getImgNaturalSizeAll (imgList, resolve) { 15 const map = new Map, 16 doc = document; 17 18 for (let fileName of imgList) { 19 const img = doc.createElement('img'); 20 21 img.src = fileName; 22 img.addEventListener('load', {handleEvent: handleLoad,size: imgList.length, map: map, resolve: resolve}, false); 23 } 24 25 }; 26})(); 27 28function resolve (map) { 29 console.log(JSON.stringify([...map])); 30} 31 32getImgNaturalSizeAll(['https://placehold.jp/4000x4000.png','https://placehold.jp/1000x1000.png', 'https://placehold.jp/150x150.png'],resolve); // [["https://placehold.jp/4000x4000.png",{"naturalWidth":4000,"naturalHeight":4000}],["https://placehold.jp/1000x1000.png",{"naturalWidth":1000,"naturalHeight":1000}],["https://placehold.jp/150x150.png",{"naturalWidth":150,"naturalHeight":150}]]

※「ファイル名の配列」とMapの順序性保持はさぼりました。
上の結果ではたまたま一致していますが、保証しません。

※このコードは既存のdocumentにあるimg要素ノードに適用できない点で汎用性がありません。img要素ノードの配列を渡す設計にすると、NodeListも渡せるようになるのでそれなりに便利です。

Re: agepan さん

投稿2018/04/28 05:19

think49

総合スコア18162

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

agepan

2018/05/10 12:43

回答遅れまして申し訳ございません。 わざわざコードを書いて頂きましてありがとうございます! 今回は今までに頂きました情報と、それをなんとかコードを弄くり回しまして実装することができました。たださらに優れたコードを取り入れたいと思いますので、頂きましたコードは今現在行っている作業が終わり次第、貴重な勉強材料として確認させて頂きます。ありがとうございました!
guest

0

このようなコードにすることで無事取得できました。

JavaScript

1var image = new Image(); 2 image.src = 'image.jpg'; 3 4 image.onload = function (){ 5 var imageWidth = this.width; 6 var imageHeight = this.height; 7 alert(imageWidth + 'x' + imageHeight); 8 }

投稿2018/04/28 04:30

agepan

総合スコア66

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Jquery未使用でも簡単に取得できます。

lang=javascript

1// オリジナル画像サイズを取得 2const getOriginalSize = () => { 3 const img = document.getElementsByClassName('fn-imageSize')[0]; 4 const imgSizeWidth = img.naturalWidth; 5 const imgSizeHeight = img.naturalHeight; 6 console.log(imgSizeWidth); 7 console.log(imgSizeHeight); 8} 9 10window.addEventListener('load', getOriginalSize, false);

------ 複数要素取得したい時 ------

lang=javascript

1// オリジナル画像サイズを取得 2const getOriginalSize = () => { 3 const img = document.getElementsByClassName('fn-imageSize'); 4 // 取得したNodeListを配列化する 5 const images = [].slice.call(img); 6 images.forEach(function(item) { 7 const imgSizeWidth = item.naturalWidth; 8 const imgSizeHeight = item.naturalHeight; 9 console.log(imgSizeWidth); 10 console.log(imgSizeHeight); 11 }); 12} 13 14window.addEventListener('load', getOriginalSize, false);

投稿2018/04/28 01:31

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

agepan

2018/04/28 03:55

ご回答ありがとうございます! > const img = document.getElementsByClassName('fn-imageSize')[0]; この部分はHTML上にある画像を差していると思いますが、画像をファイルパスで指定することでも可能でしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問