2011-08-24 17 views
21

初めてJavaで画像を操作し、非常にうまく文書化されていないいくつかのbizarro例外が発生しています。ここで失敗しているコードの行は次のとおりJava ImageIO IIOException:サポートされていないイメージタイプですか?

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

この行は例外メッセージとしてサポートされていない画像タイプでIIOExceptionを投げています。私は、Fileオブジェクトが有効であり、URLが有効であり、image.jpgが実際に他のイメージビューアで完全に正常にロードされる有効なJPGであることが、実際に例外をスローするこの行であることを確認して再確認しました。

この例外の性質について詳しく知りたい場合は、どうすればよいですか?これはJava 7でイメージを読み込むための伝統的な方法ですか、これは旧式/非推奨の方法ですか?これらの「サポートされていない画像タイプ」の例外については、そこにはたくさんの情報がありません。確かに、ImageIOはJPGをサポートしています!

ありがとうございました!

答えて

27

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

JAI ImageIOには、JREにインストールされている不要なライブラリが必要です。 私たちは、次の手順を実行します。RGBにCMYKに変換するためにJPEGCodec.createJPEGDecoder(...)

  • :昔ながらのAWT JPEGCodecを使用し、SanselanはJPEGを読み書きすることはできませんので、それはJPEG
  • のかどうか、検出する

    • 使用Apache Sanselanを、我々はその後、読み取りBufferedImageのラスタを取得し、それを手動で変換します(ICCプロファイルを使用することができますが、マニュアルの変換は、私たちのニーズに合っ)

    ここで事実番目の結果、私の質問ですPure Java alternative to JAI ImageIO for detecting CMYK images

  • +0

    もちろん、JAI ImageIOのネイティブライブラリ(少なくともWindows版)は32ビットしかサポートしていません。 – Trejkaz

    9

    残念ながら、私は不幸にも多くの標準違反JPEGファイルに出くわしました。これは残念ながら多くの種類のJPEG画像に当てはまりました。 ImageIOは特に厄介で、しばしば読み込まれ、ファイルフォーマットのチェックが厳しくない他のソフトウェアによって正しく表示されるイメージをロードすることを拒否します。

    ImageIOラッパーとしての仕様の偏差が許容範囲内にあるように見えるので、あまりにもかわいいですが、回避策の1つはOracle VMの内部JPEGデコーダ(com.sun.image.codec.jpeg.JPEGCodec)を直接使用することです。

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

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

    +0

    それは素晴らしい提案です@ jarnbjo。私の質問に答える時間をとってくれてありがとう、間違いなく道のりの思考のための食べ物。 – IAmYourFaja

    +0

    cmykイメージでそれを試してみましたが、トピックのように例外が発生し、失敗しました(javaバージョン "1.8.0_60"):com.sun.image.codec.jpeg.ImageFormatException:JPEGファイルではありません:で始まります0x00 0x08 \t at sun.awt.image.codec.JPEGImageDecoderImpl.readJPEGStream(ネイティブメソッド)〜[?:1.8.0_60] – yetanothercoder

    1

    別のオプションを使用します。瓶はヴェルナーRandelshoferにより調製:

    http://www.randelshofer.ch/blog/2011/08/reading-cmyk-jpeg-images-with-java-imageio/やモンテメディアライブラリ:http://www.randelshofer.ch/monte/

    それは非常に簡単とImageIOでの使用に類似し、CCライセンスの下で利用可能になります。

    +0

    また、次のようなJVM内部クラスも使用します。com.sun.imageio.plugins.jpeg.JPEGImageReader – Raigedas

    関連する問題