Java:如何首先获得图像尺寸,第二次也获得了整个图像



如果可能的话,我想在单独的线程中加载图像,并在加载图像时显示一些图像尺寸的单元,但最后,我想显示图像本身。

在这里,我找到了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
    }
}

最新更新