在没有传输或下载的情况下,Java中是否有任何方法可以获取图像宽度和高度?

为了获得图像的高度,我们可以使用ImageIO.read(new URL("…")).getHeight()

我的问题:

  1. 我是否正确理解此方法在计算大小之前将图像下载到本地计算机?
  2. 如果是,请将图像下载到哪个位置 – 到HDD上的某些JVM缓存或直接到RAM?
  3. 有没有办法在没有传输或下载的情况下拍摄图像的高度? 但是对服务器有某种要求?

首先,你的问题:

  1. 的种类。 首先, ImageIO.read(...)方法是方便的方法,它将解码文件中的第一个图像,使用所有默认参数进行解码。 由于所有ImageIO.read(...)操作都被委托给格式化特定插件或ImageReader实例(如JPEGImageReader ),因此这可能是特定于插件的。 但一般情况是,图像数据是“在运行中”传输和解码的。 请注意,这里没有“大小计算”,而是在这种情况下整个图像被解码为BufferedImage 。 除了解码的像素值之外,必须传送解码文件中的第一图像所需的数据,但不必存储在计算机上的任何地方。

  2. 这取决于。 有一个设置ImageIO.setUseCache(boolean) ,它控制数据是缓存在磁盘上还是缓存在RAM中。

    • 如果设置为true ,则数据临时存储在磁盘上,通常位于默认临时目录中(请参阅java.io.tempdir系统属性)。
    • 如果设置为false ,则在解码图像时将数据临时存储在存储器中。
  3. 不,除非您的服务器有一个特殊的API来为您提供此数据,并且您针对此API执行特定请求。 但是, ImageIO API确实有更多粒度方法,可以让您更快地获得图像尺寸,而无需预先下载/解码整个图像。

获得图像尺寸的更快方法是:

 try (InputStream stream = url.openStream()) { // The "useCache" setting will decide whether "input" below // will be disk or memory cached try (ImageInputStream input = ImageIO.createImageInputStream(stream)) { ImageReader reader = ImageIO.getImageReaders(input).next(); // TODO: Handle no reader try { reader.setInput(input); // Get dimensions of first image in the stream, without decoding pixel values int width = reader.getWidth(0); int height = reader.getHeight(0); } finally { reader.dispose(); } } } 

同样,根据图像格式,上述代码应该只读取确定图像尺寸所需的标题/元数据。 大多数ImageReader实现都会为此读取所有标头数据,但是,它仍然比解码整个图像要快得多,并且涉及的数据(和内存)要少得多。

由于不同的格式具有不同大小的标题,底层传输(即HTTP)可能以“块”等方式传输数据,因此很难对下载了多少数据进行任何假设。

答案是read()方法必须完成并返回一个值,因为可以调用getHeight()方法。

这甚至不是ImageIO问题,它只是基本的Java语法和语义。