Java:如何首先获得图像尺寸ASAP和SECOND也获得整个图像?

时间:2017-02-28 14:15:51

标签: java image javax.imageio

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

在这里,我发现https://stackoverflow.com/a/1560052/258483如何在不读取整个图像的情况下阅读尺寸。

现在,如果我想采用这个维度,然后不想完成工作并继续这样做并最终实现BufferedImage该怎么办?

1 个答案:

答案 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
    }
}