如果可能的话,我想在单独的线程中加载图像,并在加载图像时显示一些图像尺寸的单元,但最后,我想显示图像本身。
在这里,我找到了https://stackoverflow.com/a/1560052/258483如何在不阅读整个图像的情况下读取维度。
现在,如果我想遵循这个维度,那就不想失去工作并继续执行此操作并实现BufferedImage
终于?
以下是实现背景阅读并尽快报告尺寸的一种方法,然后继续在背景中读取图像。
试图回答您的评论中的问题:
- 您无需迭代读者。以下代码没有,它只是测试至少有一个读者可以读取给定格式的读者,并尝试使用它来读取。如果您愿意,您可以迭代并尝试下一个读者,如果第一次失败以某种方式失败。但是这样做的逻辑非常复杂,通常不需要,因为通常只有零或一个读者。
- 从理论上讲,一位读者可以阅读维度,而阅读图像的失败。但是,再次,如上所述,这不是常见的情况。通常不知道其尺寸的图像数据通常是不可能的。
-
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
}
}