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

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

ただいまの
回答率

90.35%

  • Java

    16760questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

ImageReader#getFormatNameメソッドの戻り値の

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,443

yuji38kwmt

score 433

 実現したいこと

Javaで画像のフォーマットを調べて、「JPEGのときは~、PNGのときは~」と処理を分岐させたいです。
画像フォーマットは、javax.imageio.ImageReaderクラスのgetFormatNameメソッドで取得します。

 質問1

ImageReader#getFormatNameメソッドは具体的に、どんな値を返すのでしょうか?
"PNG" OR "png", "JPEG" or "jpg"などが知りたいです。

公式サイトには、具体的に何が返るのか書かれていませんでした。
http://docs.oracle.com/javase/8/docs/api/javax/imageio/ImageReader.html#getFormatName--

  Returns a String identifying the format of the input source.
The default implementation returns originatingProvider.getFormatNames()[0]. Implementations that may not have an originating service provider, or which desire a different naming policy should override this method.

 質問2

getFormatNameメソッドの戻り値は、別クラスで定数として定義されていますか?
定義されているならば、それを参照して判定したいです。

 質問3

getFormatNameメソッドを実行したところ、戻り値は

  • JPEG画像は"JPEG"
  • PNG画像は"png"
    でした。

戻り値が大文字/小文字統一されていないのは、なぜでしょうか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+3

 質問1

ImageReaderImageWriterのインターフェイスと実装は、サービス・プロバイダー・インターフェイス(SPI)という仕組みを使っていて、直接コードをつなげないような作りになっています。

OracleJDKやOpenJDKでは(確認したわけでは無いですが、おそらく)デフォルトではImageReaderクラスの実装としてcom.sun.imageio.plugins.jpeg.JPEGImageReadercom.sun.imageio.plugins.png.PNGImageReaderが使われますが、デフォルト以外やそれ以外の実装ではこれらのクラスは使われない可能性があります。
com.sunパッケージは旧Sun Microsystem社の(現在はOracle社の)Java実装に由来するものなので、使われないどころか、そのクラス自体が存在しないJava実装の可能性があるということです。GNU Classpathがその一例です。)
そのため、それらのクラスに直接アクセスすることは推奨されていません。

同様の理由で、com.sunsunで始まるパッケージの非公開APIは直接アクセスすることは推奨されていません。
これらを理解した上であえてハックするということはありますが、当然自己責任になりますし、原則として使用しないほうが良いです。

サービスプロバイダーについては、下記を参照してください。

javax.imageio.spi.IIORegistry - Java SE 8 API ドキュメント
http://docs.oracle.com/javase/jp/8/docs/api/javax/imageio/spi/IIORegistry.html

サービス・プロバイダ・インターフェース - Wikipedia
https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%83%BB%E3%83%97%E3%83%AD%E3%83%90%E3%82%A4%E3%83%80%E3%83%BB%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9

 質問2

getFormatNameメソッドの戻り値は、別クラスで定数として定義されていますか? 

されてはいますが、質問1で書いたように、参照するべきでないクラスにあって、かつprivateなので参照できません。

JPEGは下記のクラスにあります。

com.sun.imageio.plugins.jpeg.JPEG (.java) - GrepCode Class Source
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/com/sun/imageio/plugins/jpeg/JPEG.java?av=f#172

PNGは下記のクラスにあります。

com.sun.imageio.plugins.png.PNGImageReaderSpi (.java) - GrepCode Class Source
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/com/sun/imageio/plugins/png/PNGImageReaderSpi.java?av=f#43

originatingProvider.getFormatNames()[0]はこれの最初の要素を指しています。
JPEGは"JPEG"に、PNGは"png"になります。

 質問3

これは分かりません。
インターフェイス側はoriginatingProvider.getFormatNames()[0]を返すようになっているのにもかかわらず、実装側を作った人が、特に統一することを考えずに配列の順番を決めてしまったんだと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/01 00:45

    詳しい回答ありがとうございます!

    キャンセル

  • 2016/09/01 00:53

    ベストアンサーにしていただきありがとうございます。
    解決済みになる前に補足を追記しようと思いましたが、間に合いませんでした。(^-^;
    付け足した内容によって評価は変わらないと思いますが、ご留意ください。

    キャンセル

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

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Java

    16760questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。