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

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

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

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

Q&A

解決済

1回答

3481閲覧

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

yuji38kwmt

総合スコア437

Java

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

0グッド

0クリップ

投稿2016/08/29 15:01

実現したいこと

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"

でした。

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問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/08/29 17:07

編集2016/08/31 15:49
argius

総合スコア9388

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

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

yuji38kwmt

2016/08/31 15:45

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

2016/08/31 15:53

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問