javaの勉強をしている初心者です。
getHeigth(),getWidth()についてお伺いしたいことがあります。
画像の幅、高さを取得するためにgetHeigh(),getWidth()を用いているのですが
処理後の値が-1となっており、画像のサイズを取得することが出来ません。
ネットで調べてみると、「幅が定義されていない場合、このメソッドは -1 を返し、指定された ImageObserver オブジェクトにはあとで通知されます。」と記述されているのですが、「幅が定義されていない場合」とはどういうことでしょうか?
私としては、幅が定義されていないから、このメソッドを使って幅の値を知りたいと考えています。
No.3ベストアンサー
- 回答日時:
java.applet.Applet#getImage()
java.awt.ToolKit#getImage()
などで画像を読み込んだ場合、すぐにImageオブジェクトが返ってきます。
しかし、この時点では画像データはすべてそろっていません。
バックグラウンドで読み込みが続いていて、読み込みが完了していなくても、すぐに制御が戻ってきます。
普通、画像の読み込みは時間がかかるので、とりあえず先に進めておいて、画像データがそろったら、また改めて描画するための機能です。
ImageObserver オブジェクトは、画像データの読み込みの状況について通知を受け取るためのものです。
「幅が定義されていない場合」という言い方は、確かにわかりにくいですが、ようは「まだ読んでいないのでわからない場合」という意味です。
ちなみに、英語版のjavadocを見るとgetWidth()の戻り値については、
"the width of this image, or -1 if the width is not yet known."
と書いてあり、わかりやすい表現になっています。
http://java.sun.com/j2se/1.5.0/docs/api/java/awt …
画像データが確実にそろうまで待っていたいという要求もありますので、そのために、MediaTrackerというクラスがあります。
これを使えば、画像データがそろうまで待つことができます。
このあたりのページを参考にしてみてください。
http://java.sun.com/javase/ja/6/docs/ja/api/java …
http://terai.xrea.jp/Swing/MediaTracker.html
No.2
- 回答日時:
コンストラクタ内でImageのgetHeigh(),getWidth()を取得しようとしてないだろうか。
だとすると、これは失敗する。Javaのバージョンによる面もあるが、これらは一般にコンストラクタの終了後でないと機能しなかったはず。ややこしい話になるのでかいつまんで書くが、JavaはAWTの根本的な部分で、グラフィック関連の機能をネイティブ環境に依存している。これは「Peer」と呼ばれるオブジェクトによって介在される。このPeerが作成されるのがコンストラクタ完了後で、それまでグラフィック関連の一部は機能しない。
なので、もしコンストラクタ内で呼び出しているのであれば、たとえばpaint内とかで呼び出すようにしてみるとうまくいくはず。個人的には、addNotifyメソッドをオーバーライドして処理することが多いな。
ご回答ありがとうございます。
確認したところコンストラクタ内で取得をしてはいませんでした。
参考になる意見ありがとうございました。
addNotifyメソッドについては、まだ勉強していないのでこれから勉強してみます。
No.1
- 回答日時:
ImageクラスのgetHeight、getWidthメソッドでしょうか。
Javaは、Internet上で動くことをテーマのひとつとして設計されました。
ネット上の画像を見る場合を考えると、
(1)「画像が存在することがわかった状態」
(2)「画像の大きさ・解像度がわかった状態」
(3)「画像の内容がロードされた状態」
のように、段階的に情報が入ってきます。
そのため、JavaのImageは、幅や高さが確定されていない段階でも
Imageとして扱えるようになっています。
そのかわり、必ず幅や高さが得られるわけではありません。
状況がわからないので何とも言えませんが、
呼び出した段階で本当に情報が無いのかも知れません。
通常の「イメージファイル」と同じ感覚で扱えるのは、
ImageよりもむしろBufferedImageクラスだと思います。
固定的な画像を使うなら、BufferedImageクラスを使う方がいいかもしれません。
これらのような状態があることを初めて知り、とても勉強になりました。
BufferdImageクラスも試してみます。
ご回答ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript ブラウザの横幅に応じてとある画像(e.jpg)を画面いっぱいに表示できるようにしたいです。(写真の横 1 2022/10/06 21:17
- 工学 3dB帯域幅と6dB帯域幅 4 2023/06/11 08:02
- Excel(エクセル) excelの列幅高さが勝手に変わる(特定のPCだけ) 8 2022/07/14 16:51
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- 統計学 統計学、エクセルがわかりません!解答と詳しい解説をお願いします! (1)それぞれの地域別に記述統計量 9 2022/08/21 16:30
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- 政治 私の発明した「二階建て漢字」は使えるでしょうか? 3 2023/02/08 16:40
- Excel(エクセル) Excel2019 マクロを使用し画像を貼り付けした際のリンク切れについて 2 2022/11/15 16:14
- 哲学 哲学を勉強する意義とは? 哲学について先週累計31時間もググって調べたことを激しく後悔し、自分の部屋 9 2023/08/19 00:09
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBA 画像を貼り付ける...
-
VB.netでメソッドからコントロ...
-
Dispose()は、どんな時に使うの...
-
C#のクラスで値渡しをする
-
VB.NETでのnothing の意義について
-
Vba ListViewの行挿入に関して...
-
VBAでの[]
-
サーブレットコンテキストの意...
-
WSHについて教えてください。
-
オブジェクトの参照渡しについて
-
C# トランザクション処理
-
C#で親にイベントを投げる方法
-
Excel VBA 定数にオブジェクト...
-
SocketでXMLオブジェクトを送信...
-
ADOのOPENで実行時エラー
-
servletからjspへオブジェクト...
-
System.Collections.SortedList
-
getParameter()について
-
String型からlong型への変換は...
-
MessageBox.Show(Me,…の「Me」...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
サーブレットコンテキストの意...
-
エクセルVBA 画像を貼り付ける...
-
servletからjspへオブジェクト...
-
VB.netでメソッドからコントロ...
-
JSPでのArrayListの表示につい...
-
VBAでの[]
-
javaで、、、
-
C#のクラスで値渡しをする
-
Excel VBA 定数にオブジェクト...
-
Dispose()は、どんな時に使うの...
-
Vba ListViewの行挿入に関して...
-
Javaでブラウザ判定
-
getParameter()について
-
VB.NETでのnothing の意義について
-
PrintFormを使用してのプリント
-
ピクチャーボックスに点を打つ...
-
String型からlong型への変換は...
-
drawStringの座標について
-
エクセルVBA/SpecialCellsで特...
-
GridViewに行追加するには?
おすすめ情報