在没有传输或下载的情况下,Java中是否有任何方法可以获取图像宽度和高度?
为了获得图像的高度,我们可以使用ImageIO.read(new URL("…")).getHeight()
。
我的问题:
- 我是否正确理解此方法在计算大小之前将图像下载到本地计算机?
- 如果是,请将图像下载到哪个位置 – 到HDD上的某些JVM缓存或直接到RAM?
- 有没有办法在没有传输或下载的情况下拍摄图像的高度? 但是对服务器有某种要求?
首先,你的问题:
-
的种类。 首先,
ImageIO.read(...)
方法是方便的方法,它将解码文件中的第一个图像,使用所有默认参数进行解码。 由于所有ImageIO.read(...)
操作都被委托给格式化特定插件或ImageReader
实例(如JPEGImageReader
),因此这可能是特定于插件的。 但一般情况是,图像数据是“在运行中”传输和解码的。 请注意,这里没有“大小计算”,而是在这种情况下整个图像被解码为BufferedImage
。 除了解码的像素值之外,必须传送解码文件中的第一图像所需的数据,但不必存储在计算机上的任何地方。 -
这取决于。 有一个设置
ImageIO.setUseCache(boolean)
,它控制数据是缓存在磁盘上还是缓存在RAM中。- 如果设置为
true
,则数据临时存储在磁盘上,通常位于默认临时目录中(请参阅java.io.tempdir
系统属性)。 - 如果设置为
false
,则在解码图像时将数据临时存储在存储器中。
- 如果设置为
-
不,除非您的服务器有一个特殊的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语法和语义。