まず、ImageIO.read(...)
は任意の形式のファイルの単一の(最初の)イメージを読むことができる便利な方法です。
場合は、代わりに、あなたの入力のためのImageReader
を得るには、(一般的に)getNumImages(boolean allowSearch)
を使用して入力して画像の数を取得することができ、かつ読み(またはスキップ)個々の画像はread(int imageIndex, ImageReadParam param)
を使用。以下のような
何か:
// Create input stream
try (ImageInputStream input = ImageIO.createImageInputStream(file)) {
// Get the reader
Iterator<ImageReader> readers = ImageIO.getImageReaders(input);
if (!readers.hasNext()) {
throw new IllegalArgumentException("No reader for: " + file);
}
ImageReader reader = readers.next();
try {
reader.setInput(input);
// Optionally, listen for read warnings, progress, etc.
reader.addIIOReadWarningListener(...);
reader.addIIOReadProgressListener(...);
ImageReadParam param = reader.getDefaultReadParam();
// Note: For some formats (ie. GIF), finding the number of images
// requires searching the entire stream. In this case, it may
// be more convenient to just read until you get an IndexOutOfBoundsException
for (int i = 0; i < reader.getNumImages(true); i++) {
// Optionally, control read settings like sub sampling, source region or destination etc.
param.setSourceSubsampling(...);
param.setSourceRegion(...);
param.setDestination(...);
// ...
// Finally read the image, using settings from param
BufferedImage image = reader.read(i, param);
// Optionally, read thumbnails, meta data, etc...
int numThumbs = reader.getNumThumbnails(0);
// ...
}
}
finally {
// Dispose reader in finally block to avoid memory leaks
reader.dispose();
}
}
JREバンドルJPEGImageReader
は理論的にも、単一ストリームで複数のJFIFのサブをサポートする必要があります。しかし、私はあなたがサポートが壊れていることがわかると思います(少なくともImageIOプラグインプロジェクトにはopen issue to fix thisがあります)。
残念ながら、デコードせずに(またはJFIFストリームの外に保存された長さの)JPEG圧縮画像の長さを見つけることはできません。あなたが試みることができる
ことの一つは、(「スタート・オブ・イメージ」、0xffd8
)次SOIため、その後、前方スキャン最初の画像を読み取るために(おそらくImageInputStream
がラップ)されたマーカーは、は2つのバイトはバック求めます(SOIマーカーの場合)、次のイメージの読み取りを試みます。 SOIマーカーは、JPEGエンコードされたデータの内部には存在しません。
JPEGとJFIF segmentsについては、Wikipediaでもっと詳しく読むことができます。
複数のSOI/EOIなしで、複数の画像を持つJPEG(JFIF)があるとは思えません。どのソフトウェアがそれを書いたのか知っていますか?共有するサンプルファイルがありますか?もしそうなら、私はおそらく助けることができます。 – haraldK
私はnitfファイルを扱っていましたが、共有できませんが、JPEG画像を含むことができるDoDイメージ形式です。私が探していたファイルはjpegに準拠していなかったと思います.DoDのウェブサイトのサンプルファイルには、soi、eoiというタグがあります。 – broccolli