如果可能的话,我想在单独的线程中加载图像,并在加载图像时显示图像尺寸的一些存根,但最后,我想显示图像本身。
在这里,我发现https://stackoverflow.com/a/1560052/258483如何在不读取整个图像的情况下阅读尺寸。
现在,如果我想采用这个维度,然后不想完成工作并继续这样做并最终实现BufferedImage
该怎么办?
答案 0 :(得分:0)
这是实现背景阅读的一种方法,并尽快报告尺寸,然后继续在后台阅读图像。
尝试回答您的评论中的问题:
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
}
}