getResourceAsStreamを使った画像読み込みについて

このQ&Aのポイント
  • Javaの授業で、オブジェクト指向を使ったゲーム作りの課題があります。しかし、パッケージやクラスの説明がなく、改良の方法が分かりません。
  • 調べても分からないため、jarファイルに自作の画像を読み込む方法を探しています。ImageIOはjarには不適合で、代わりにClassLoaderのgetResourceAsStreamメソッドを使用することが指定されています。
  • しかし、どのように書けばいいのかが分からず、APIリファレンスを見ても理解できません。また、画像の表示部分も初歩的な質問ですが、何かアドバイスがあれば教えてください。
回答を見る
  • ベストアンサー

getResourceAsStreamを使った画像読み込みについて

学校の授業でJavaをやっています。 ですが、パッケージもクラスの説明も受けないままに「オブジェクト指向」と言うことでプリントを配られてのスタートだったので(Swingを使ったゲームを作ろうという課題)一通りの手順などはプリントに書いてあるのですが、仕組みをわかっていないのでここを改良しろなどと言う問題は全く解けません…… 先生曰く自分で調べろとのことですが正直丸投げにされてる感がありますorz 本屋で立ち読みしてようやくパッケージやクラスの意味はできましたが……本当はタイトルのことだけではなくもっといろいろお尋ねしたいです……。 そんな中、jarのゲームを作る課題が出されました。 そこで自作の画像を読み込もうと思ったのですが、演習で使ったImageIOはjarには不適合らしく、代わりにClassRoaderクラスのgetResourceAsStreamメソッドを使用しろという指定がありました。 ですが、getResourceAsStream(/ファイル名)と描くところまではわかったのですが、そこから先がどのように書けばいいのか全く分かりません。 APIリファレンスでClassLoaderやgetResourceAsStream項目を見てみても、謎が解けるどころかかえって混乱してしまいました。 とりあえずImageIOを使った時のソースをいじってみたのですが、メソッドの返り型がありませんと言われてしまいます。 そもそも問題はそれだけではないと思うのですが……。 public ClassLoader(){ Image image =null; try{ getClass().getResourceAsStream("/xxx.gif"); }catch(Exception e){ e.printStackTrace(); image = null; } return image; } ちなみに、読みこんだ画像を表示するソースはこのように書いています。 public void run() {   //xxx.gif   image=ClassRoader();   graphics = image.getGraphics();   new Character(image, 7, 6,1); } 正直ここを見ている皆さんにとっては初歩的すぎることなのかもしれませんが…… 何かお気づきのことがあったらよろしくお願いします。

  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
noname#94983
noname#94983
回答No.1

初歩的すぎる? いいや、そんなことはない。わからない人のほうが多いだろう。 こんなかったるいやりかた、今は誰もしないからな(笑)。 InputStream in = getClass().getResourceAsStream("xxx.gif"); byte buffer[] = new byte[in.available()]; for (int i = 0, n = in.available(); i < n; i++) { buffer[i] = (byte)in.read(); } Image image = Toolkit.getDefaultToolkit().createImage(buffer); こんな感じだろうかね。 だが、なんだっていまどきわざわざgetResourceAsStreamを使わなければならないのだろうか。getResourceを使えば、 URL url = getClass().getResource("xxx.gif"); Image image = Toolkit.getDefaultToolkit().createImage(url); たったこれだけなんだが。 先生に、「調べてみたところ、getResourceを使ったほうが簡単にイメージを読み込めることがわかったんですが、これを使ってはいけないんでしょうか?」と聞いてみれば。

MR-0622
質問者

お礼

アドバイスありがとうございました! その後どうにかできましたが相変わらずJAVAはよくわからないので夏休みを利用して勉強しようと思います。 お礼が大変遅くなってしまい申し訳ありませんでした。

関連するQ&A

  • paintメソッドでエラー

    以下はSwingのフレーム上に画像を表示させようとして書いたものの全文です。実行するとSyntax errorがでますが、これはどうしてでしょうか。 なおべつのプログラムでmainメソッドとpaintメソッドを同じクラスに書いたらうまく表示できました。 アドバイスお願いします。 import java.awt.Graphics; import java.awt.image.BufferedImage; import javax.imageio.ImageIO; import javax.swing.JFrame; public class MyImage3 {  public static void main(String[] args) {   MyFrame7 frame1=new MyFrame7();   frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   frame1.pack();   frame1.setBounds(100,100,400,320);   frame1.setVisible(true);  } } class MyFrame7 extends JFrame{  public MyFrame7(){   public void paint(Graphics g){   //この行でSyntax error発生    BufferedImage bImage1=null;    try {     bImage1=ImageIO.read(getClass().getResource("k_1pin.gif"));    } catch (Exception e) {     e.printStackTrace();    }    g.drawImage(bImage1,40,40,this);   }  } }

    • ベストアンサー
    • Java
  • 【JAVA】画像のサイズを大きく変化させない方法

    行き詰ったので質問させてください。 TIFファイル画像があり、それに文字を組み込みたいため以下のようなソースを書きました。 BufferedImage image = null; image = ImageIO.read(file); Graphics graphics = image.createGraphics(); graphics.setColor(Color.RED); graphics.setFont(new Font("MSゴシック", Font.BOLD, 100)); graphics.drowString("TEST",100,200); ImageIO.write(image,"tif", new File(file.toString())); 画像には「TEST」の文字が組み込まれたのですが、ファイルサイズが 50kbから500kb(約10倍)になり、サイズ変化させたくなかったため対策 を練ってます。 JPEGEncoderParamクラスなどを利用し、setQualityメソッドで画質を変えた りもしたのですが、それでも元画像の7倍ほどになり、他の方法を取らざるを得ません。 画像のサイズは元サイズとほぼ変わらないような方法で、プログラムを組むことは できますでしょうか。ちなみに画像は白黒です。 以上、お力添えください。

  • jarファイル内のクラスからjarファイル名の取得

    こんにちわ!yukimura1024です。 ちょっとわかりにくいタイトルかもですが質問です(^^; ○前提条件 1.コマンドプロンプトで以下のようにjarファイルを実行します。  java -jar xxx.jar xxx1 xxx2 2.xxx.jarのなかはx.class、y.class、z.class、と3つのクラスがあり、   x.classのmainメソッドが最初に呼び出されます。 ○質問 上記条件のとき、x.classのmainメソッド内で「xxx.jar」という文字列を取得したいのですが こんなことは可能でしょうか? なぜこんなことをしたいのかというと以下の理由からです。 1.xxx.jarのほかにyyy.jarというjarファイルも作成し、x.class、y.class、z.classを格納する。 2.yyy.jarも最初にx.classのmainメソッドが呼び出される。 3.x.classのmainメソッド内でxxx.jar、yyy.jarのどちらとして呼び出されたのか知りたい! ※2つのjarファイルに格納するx.class、y.class、z.classはまったく同じものです。 アドバイスいただける方いましたらお願いします。

    • ベストアンサー
    • Java
  • JARファイル内でのファイルの作成

    JARファイル内に格納されたクラスファイル(MainWindow.class)を実行して、同じJARファイル内にバイナリファイル(DataFile.bin)を作成したいのですがどのようにしたらよいでしょうか。  JARファイル内のクラスファイル(MainWindow.class)に記述された、randomAccessFile(string,"rw")命令によって、MainWindow.classが格納されているのと同じJARファイル内にDataFile.binを新規作成したいと思っています。  ちなみに、作成したファイルは、 URL url=null; url=getClass.getResource("DataFile.bin")で呼び出したいと思っています。  インターネット等で検索しているのですが、なかなか見つからなくて困っています。すみませんがどうかよろしくお願いします。

    • ベストアンサー
    • Java
  • javaの初歩的な質問です

    以下のソースコードをかきました Image image = ImageIO.read(Thread.currentThread().getContextClassLoader().getResourceAsStream("16_16.png")); すると以下のエラーがでてきました Exception in thread "main" java.lang.IllegalArgumentException: input == null! at javax.imageio.ImageIO.read(Unknown Source) at Task.<init>(Task.java:23) at Task.main(Task.java:16) 16_16.png が見つからないというメッセージでしょうか? しかし16_16.pngはエクリプス上ではプロジェクト直下に入っているようにみえます。 数ヶ月前まではエラーなどは出てなかったと思うのですが。

    • ベストアンサー
    • Java
  • getTookkit() エラーについて

    java初心者でメモ帳を作成しています。printoutクラスを作成し印刷機能をつけてみましたがエラーがでてしまい、web等で調べて見ましたが解決せず困っています。 エラー内容はシンボルをみつけられません シンボル:メソッド getToolkit() ソース全体が間違っているのかもしれません。宜しくお願いします。 import java.awt.*; import java.awt.event.*; import java.io.*; import javax.swing.*; class PrintOut { void print( JTextArea jta, JFrame obj ) { PrintJob pj = getToolkit().getPrintJob(this,"Printing Test", null); if (pj != null) { Graphics g = pj.getGraphics(); if (g != null) { jta.printAll(g); g.dispose(); } pj.end(); } } }

  • 配列クラスのクラス名

    配列クラスのクラス名 配列クラスのクラス名を教えてください。 配列はクラスですよね。そこまでは分かります。 こんなコードを実行しましたが System.out.println((new int[0]).getClass()); System.out.println((new boolean[0]).getClass()); System.out.println((new String[0]).getClass()); System.out.println((new Integer[0]).getClass()); 親切にこのような結果を出力してくれます。 class [I class [Z class [Ljava.lang.String; class [Ljava.lang.Integer; 結果として配列が何というクラスなのかは分かりません。 (もしかして『[I』『[Z』『[L』という名前のクラスでしょうか?) 昔Javaのソースを読んだときに、配列クラスのファイルも 読んだことがあるような気がするのですが、 なんと言うクラスだったか忘れてしまいました。 パッケージ名+クラス名を教えてください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • jarファイルの起動方法

    クラスファイルと画像をjarファイルに固めてクリックで起動したいのですができません。正確に言うと、最初の2~3回はできていたのですが、何回かプログラムを修正せいているうちにjarに固めてクリックしても起動しなくなりました。  マニフェストファイルは、 Main-Class: MainWindow(この後改行) です。 jarファイルへの固め方は、testフォルダにclassファイルと画像ファイルがあるものとして、 cd C:\test C:\j2sdk1.4.2_05\bin\jar cf kakei.jar *.class *.PNG C:\j2sdk1.4.2_05\bin\jar ufm kakei.jar manifest.txt です。 プログラム内の画像のロード方法は、 MediaTracker tracker=null; Image images=null; try{ tracker=new MediaTracker(this);//画像の取り込み tk=Toolkit.getDefaultToolkit(); URL img=getClass().getResource("img1.PNG"); images=tk.createImage(img); tracker.addImage(images,0,93,28); } catch(Excetption e){} 最初の2~3回はこの方法できちんと実行できました。また、ほかのアプリケーションもこの方法でやっていましたがうまくいきます。画面にまったく表示されませんが実行後にjarファイルを削除できないので おそらく実行はされているのだと思います。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • Java
  • 作ったjarファイルが起動しません。

    Eclipseでエクスポートしたjarファイルが起動しません。 hello.jarというのを作ったのですが コマンドプロンプトを使って java -jar hello.jar ならば正常に起動します。 マニフェストファイルはちゃんとできているように思います。 他の(自分で作ったものでない)JARファイルは普通に動きます。 コードは package hello.konnnitiha; public class Hello { public static void main(String[] args){ System.out.println("Hello!"); } } マニフェストファイルは Manifest-Version: 1.0 Main-Class: hello.konnnitiha.Hello となっています。 ちなみにコマンドプロンプトで java hello.jar で起動しようとすると Exception in thread "main" java.lang.NoClassDefFoundError: hello/jar Caused by: java.lang.ClassNotFoundException: hello.jar at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) Could not find the main class: hello.jar. Program will exit. となります。

  • 内部リソースファイルを取得する際のファイル名の記述方法

     ファイルを開く際の、  フォルダ構造は以下のようになっています。 MainPanel.java      base   - Chara.java      Resource - charachip - image.gif ―――Chara.javaにおいて、以下のようなコンストラクタを作成しました。(int xとint yは気にしないでください) public Chara(int x, int y, String filename){  //画像の読み込み  chara_image = ImageIO.read(getClass().getResource(filename)); } ―――MainPanel.javaで、それを呼び出し、 Chara chipfile = new Chara(3,3,"Resource/charachip/hyouga.gif");  と、してみましたが・・・この第三引数の記述、明らかに間違っていますよね・・・。  この読み取る画像ファイルの指定は、どの.javaファイル(.classファイル)のあるディレクトリをカレントディレクトリとして、又、どのような書式で記述すればよいのでしょうか?  一応最終的にはJARファイルにまとめる予定です。但し、今の段階では(当たり前ですが)classファイルの状態です。  環境は、JDK 6 Update1、Eclipse3.2.0です。 ※挿入されているスペースは全て全角です。

    • ベストアンサー
    • Java

専門家に質問してみよう