在没有传输或下载的情况下,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)可能以“块”等方式传输数据,因此很难对下载多少数据或需要下载多少数据做出任何假设.

上一篇:如何使用RescaleOp设置图像大小


下一篇:栅格之外的Java getSubimage()