8

このファイルを使用した ImageIO.read(imagePath) は CMMException を返します。Java がこの一見有効なファイルに対処できない理由http://www.jthink.net/jaikoz/scratch/front.jpg

java.awt.color.CMMException: Invalid image format
    at sun.awt.color.CMM.checkStatus(Unknown Source)
    at sun.awt.color.ICC_Transform.<init>(Unknown Source)
    at java.awt.image.ColorConvertOp.filter(Unknown Source)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.acceptPixels(Unknown Source)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.readImage(Native Method)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(Unknown Source)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(Unknown Source)
    at javax.imageio.ImageIO.read(Unknown Source)
    at javax.imageio.ImageIO.read(Unknown Source)
4

3 に答える 3

15

私はあなたの問題のコツをつかんだと思います。あなたがリンクした画像を確認しました ( http://www.jthink.net/jaikoz/scratch/front.jpg )。Exif および JFIF 規格によるものです。

のようなImageIO.read('some file')ことをしていると、デフォルトの sun jpeg 実装が呼び出されますcom.sun.imageio.plugins.jpeg.JPEGImageReader。以前は、JFIF ファイルの読み込みに問題があり、バグ 6488904がありました (最後にあるコメントを確認してください)。

仕様によると、Exif と JFIF はどちらも、それぞれのアプリケーション マーカー セグメントが SOI (APP1 と APP0) の直後になければならないことを要求しているため、仕様ごとに JPEG ファイルが両方の標準に準拠することは実際には不可能です。

だいぶ前に報道されてたけど

回避策は、JAI ライブラリ ( https://jai.dev.java.net/binary-builds.html#Release_builds ) を使用することです。Java (ネイティブ アクセラレーションなし)バージョンを使用しています。

SeekableStream seekableStream =  new FileSeekableStream(new File("front.jpg"));
ParameterBlock pb = new ParameterBlock();
pb.add(seekableStream);

BufferedImage image = JAI.create("jpeg", pb).getAsBufferedImage();

これが役立つことを願っています。

于 2010-12-17T16:45:05.490 に答える
4

ところで、この問題は JDK8 で修正されています ( http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7064516の下部にあるコミットに注意してください)。JDK8 のプレリリース ビルドが、上記のように JDK7 で失敗するイメージを適切にロードすることを確認しました。

于 2013-10-09T21:18:35.177 に答える