画像分類の学習モデルを作るツールをJavaで作っていたのですが、あるJPEGファイルをImageIOで読もうとすると以下のエラーが出ました。
Exception in thread "main" java.awt.color.CMMException: Invalid image format at sun.awt.color.CMM.checkStatus(CMM.java:131) at sun.awt.color.ICC_Transform.(ICC_Transform.java:89) at java.awt.image.ColorConvertOp.filter(ColorConvertOp.java:516) at com.sun.imageio.plugins.jpeg.JPEGImageReader.acceptPixels(JPEGImageReader.java:1169) at com.sun.imageio.plugins.jpeg.JPEGImageReader.readImage(Native Method) at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:1137) at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:948) at javax.imageio.ImageIO.read(ImageIO.java:1422) at javax.imageio.ImageIO.read(ImageIO.java:1282) at Test.main(Test.java:31
JAIだと読み込めるというので、処理速度が落ちるけどそっちを使うようにしてみた。
BufferedImage img = null; try { img = ImageIO.read(file); } catch (java.awt.color.CMMException e) { img = JAI.create("fileload", file.getAbsolutePath()).getAsBufferedImage(); } catch (IOException e) { // ちゃんと処理しようね! }
正しい使い方としては、JAIをきちんとセットアップしてImageIO経由で使えるようにし、ImageReaderを列挙して順番に試すというのが正統な方法なのかなと。今回は手抜き処理。
JAIだけでも良いんだけど、速度が・・。
参考サイト
- http://stackoverflow.com/questions/2999528/is-there-a-100-java-alternative-to-imageio-for-reading-jpeg-files
- http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4924909
- http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6488904
- http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6488902