web-dev-qa-db-ja.com

Java ImageIO IIOException:サポートされていない画像タイプですか?

Java=で初めて画像を操作すると、十分に文書化されていない奇妙な例外が発生します。失敗しているコード行は次のとおりです。

BufferedImage imgSelected = ImageIO.read(new File("/abs/url/to/file/image.jpg"));

この行は、例外メッセージとしてnsupported image typeのIIOExceptionをスローしています。実際にこの行が例外をスローしていること、Fileオブジェクトが有効であること、URLが有効であること、およびimage.jpgが実際に有効に読み込まれているJPGであることを確認し、再確認しました。他の画像ビューア。

この例外の性質に関する詳細情報を取得するにはどうすればよいですか?これは、Java 7で画像をロードするための従来の方法ですか、それとも古い/非推奨の方法ですか?これらの「サポートされていない画像タイプ」の例外に関する情報はあまりありませんし、確かに、ImageIOはJPGをサポートしています!

助けてくれてありがとう!

29
IAmYourFaja

JPEGのエンコードを確認してください。たとえば、ImageIOはCMYKでエンコードされたjpeg画像を読み取ることができません。 AFAIK、ImageIOは何年も更新されていないため、公式の代替/拡張機能 JAI ImageIO を試してみてください。

残念ながら、JAI ImageIOにはJREにインストールされているいくつかのネイティブライブラリが必要ですが、これは望ましくない場合があります。次のことを行います。

  • Apache Sanselan を使用して、JPEGかどうかを検出します
  • sanselanはJPEGを読み書きできないため、従来のAWT JPEGCodecを使用してください:JPEGCodec.createJPEGDecoder(...)
  • cMYKをRGBに変換するには、読み取りBufferedImageのラスターを取得して手動で変換します(ICCプロファイルを使用できますが、手動変換はニーズに適合します)。

ImageIOがすべてのタイプのJPEG画像をサポートするわけではないという事実に起因する私の質問は次のとおりです。そのメッセージが表示される理由について、もう少し詳しく説明します。 Pure = Java CMYK画像を検出するためのJAI ImageIOの代替

33
Thomas

残念ながら、多くの標準違反のJPEGファイルに遭遇しました。 ImageIOは特にうるさく、イメージのロードを拒否することがよくあります。イメージは、他のソフトウェアによってロードされ、見かけ上正しく表示されますが、ファイル形式のチェックはそれほど厳密ではありません。

それはあまりきれいではありませんが、1つの回避策は、Oracle VM内部JPEGデコーダーを直接使用すること(com.Sun.image.codec.jpeg.JPEGCodec))です。 ImageIOラッパー:

BufferedImage img = 
    JPEGCodec.createJPEGDecoder(inputStream).decodeAsBufferedImage();

もちろん、これは理想的な解決策ではありません。実装固有のクラスを使用すると、特定のVMベンダーにロックされ、新しいVMバージョンで中断する可能性があるためですが、あなたは制御された環境でのみソフトウェアを使用します、それは全くソリューションがないよりも良いかもしれません。

11
jarnbjo

別のオプションは、Werner Randelshoferによって準備された.jarを使用することです:

http://www.randelshofer.ch/blog/2011/08/reading-cmyk-jpeg-images-with-Java-imageio/ またはMonte Media Library: http:// www.randelshofer.ch/monte/

それは非常に簡単でImageIOの使用法に似ており、CCライセンスで利用できます。

1
Ravbaker