JAI を使用して JPEG 画像を読み込んでいるときに、例外が発生しました。
原因: com.sun.media.jai.codecimpl.util.ImagingException: 画像ストリームを処理できません。形式が正しくありません。... 43 以上 原因: com.sun.image.codec.jpeg.ImageFormatException: JPEG ファイルではありません: sun.awt.image.codec.JPEGImageDecoderImpl.readJPEGStream(Native Method) で 0xff 0xd9 で始まります
16 進数を見ると、実際には、ファイル ストリームの末尾のかなり上に 0xff 0xd9 ブロックがあります。ウィキペディアによると:
EOI 0xFF、0xD9 なし 画像の終わり
ただし、このファイルを任意の画像エディターで開くことができることはわかっています。paint.net エディタで 95% の圧縮率で再保存すると、ブロックが消えます (このブロックはヘッダーにあり、保存時に paint.net がヘッダーを書き換えるためだと思います)。
簡単なバイトチェックで検出できることはわかっています https://stackoverflow.com/a/10069478/51841
どちらかありますか
- 残りの JAI にとって問題にならないように、Java で画像を開いて再保存する方法 (最後に RenderedOp を取得するなど)
- このヘッダーにもかかわらず、JAI に画像を読み取らせる方法 (ほとんどの画像リーダーが行うように)
- そのバイナリ ブロックを変更する安全な方法 (つまり、別のブロックに置き換える)
または、私が見逃しているこの問題について、誰かがこれ以上の洞察を持っていますか?