バックグラウンド読み取りを実装し、寸法をできるだけ早く報告し、バックグラウンドで画像を読み続ける方法の1つです。あなたのコメントからの質問に答えることをしようとする
:
- あなたは読者を反復処理する必要はありません。以下のコードは、指定されたフォーマットを読み取ることができるリーダーが少なくとも1人いるかどうかをテストし、それを使用して読み取りを試みます。最初の何らかの方法で失敗した場合は、次のリーダーを試してみることもできます。しかし、これを行うためのロジックは非常に複雑で、普通はゼロまたは1つのリーダーしかないので通常は必要ありません。
- 理論的には、1人の読者が寸法を読み取ってイメージの読取りに失敗する可能性があります。しかし、上記のように、これは一般的なケースではありません。その寸法を知らなくても、画像データを読み取ることは通常不可能です。
ImageReader
インスタンスは再利用可能ですが(スレッドセーフではないため、スレッド間で共有しないでください)、さまざまな入力を(同じ形式で)読み込むために使用できます。したがって、これはAPIのパフォーマンス上の考慮事項です。あなたはまた、ファイル名に基づいて読者を得ることができます。その場合、とにかく入力をどうにかして渡す必要があります。
リンクされた回答のコードを理解していれば、コードは自明であるはずです。
public class BackgroundImageReader implements Callable<BufferedImage> {
private final Object input;
public BackgroundImageReader(File input) {
this.input = input;
}
public BackgroundImageReader(InputStream input) {
this.input = input;
}
@Override
public BufferedImage call() throws IOException {
try (ImageInputStream stream = ImageIO.createImageInputStream(input)) {
Iterator<ImageReader> readers = ImageIO.getImageReaders(stream);
if (readers.hasNext()) {
ImageReader reader = readers.next();
try {
reader.setInput(stream);
updateImageDimensions(new Dimension(reader.getWidth(0), reader.getHeight(0)));
return reader.read(0);
} finally {
reader.dispose();
}
}
throw new IOException("Could not read image");
}
}
public void updateImageDimensions(Dimension dimension) {
// TODO: Implement callback mechanism
}
}
読者は 'readImage(null)'または 'read(0)'を試したことがありますか? –
はい、私は論理を理解していません。なぜ私は読者を反復すべきですか?それは多くの読者が何ですか?イメージが別のリーダで利用可能な間に次元が1つの読者で利用可能である可能性はありますか? – Dims
また、このリーダーはその入力から取得されましたが、なぜ私はImageReader#setInputを呼び出す必要がありますか?なぜそれは自動的に設定されませんか? – Dims