- ベストアンサー
getHeigth,getWidthについて
javaの勉強をしている初心者です。 getHeigth(),getWidth()についてお伺いしたいことがあります。 画像の幅、高さを取得するためにgetHeigh(),getWidth()を用いているのですが 処理後の値が-1となっており、画像のサイズを取得することが出来ません。 ネットで調べてみると、「幅が定義されていない場合、このメソッドは -1 を返し、指定された ImageObserver オブジェクトにはあとで通知されます。」と記述されているのですが、「幅が定義されていない場合」とはどういうことでしょうか? 私としては、幅が定義されていないから、このメソッドを使って幅の値を知りたいと考えています。
- みんなの回答 (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/Image.html 画像データが確実にそろうまで待っていたいという要求もありますので、そのために、MediaTrackerというクラスがあります。 これを使えば、画像データがそろうまで待つことができます。 このあたりのページを参考にしてみてください。 http://java.sun.com/javase/ja/6/docs/ja/api/java/awt/MediaTracker.html http://terai.xrea.jp/Swing/MediaTracker.html
その他の回答 (2)
コンストラクタ内でImageのgetHeigh(),getWidth()を取得しようとしてないだろうか。だとすると、これは失敗する。Javaのバージョンによる面もあるが、これらは一般にコンストラクタの終了後でないと機能しなかったはず。 ややこしい話になるのでかいつまんで書くが、JavaはAWTの根本的な部分で、グラフィック関連の機能をネイティブ環境に依存している。これは「Peer」と呼ばれるオブジェクトによって介在される。このPeerが作成されるのがコンストラクタ完了後で、それまでグラフィック関連の一部は機能しない。 なので、もしコンストラクタ内で呼び出しているのであれば、たとえばpaint内とかで呼び出すようにしてみるとうまくいくはず。個人的には、addNotifyメソッドをオーバーライドして処理することが多いな。
- liar_adan
- ベストアンサー率48% (730/1515)
ImageクラスのgetHeight、getWidthメソッドでしょうか。 Javaは、Internet上で動くことをテーマのひとつとして設計されました。 ネット上の画像を見る場合を考えると、 (1)「画像が存在することがわかった状態」 (2)「画像の大きさ・解像度がわかった状態」 (3)「画像の内容がロードされた状態」 のように、段階的に情報が入ってきます。 そのため、JavaのImageは、幅や高さが確定されていない段階でも Imageとして扱えるようになっています。 そのかわり、必ず幅や高さが得られるわけではありません。 状況がわからないので何とも言えませんが、 呼び出した段階で本当に情報が無いのかも知れません。 通常の「イメージファイル」と同じ感覚で扱えるのは、 ImageよりもむしろBufferedImageクラスだと思います。 固定的な画像を使うなら、BufferedImageクラスを使う方がいいかもしれません。
お礼
これらのような状態があることを初めて知り、とても勉強になりました。 BufferdImageクラスも試してみます。 ご回答ありがとうございました。
お礼
ご回答ありがとうございます。 確認したところコンストラクタ内で取得をしてはいませんでした。 参考になる意見ありがとうございました。 addNotifyメソッドについては、まだ勉強していないのでこれから勉強してみます。