67

有没有办法在不读取整个文件的情况下获取图像的尺寸?

URL url=new URL(<BIG_IMAGE_URL>);
BufferedImage img=ImageIO.read(url);
System.out.println(img.getWidth()+" "+img.getHeight());
img=null;
4

4 回答 4

121
try(ImageInputStream in = ImageIO.createImageInputStream(resourceFile)){
    final Iterator<ImageReader> readers = ImageIO.getImageReaders(in);
    if (readers.hasNext()) {
        ImageReader reader = readers.next();
        try {
            reader.setInput(in);
            return new Dimension(reader.getWidth(0), reader.getHeight(0));
        } finally {
            reader.dispose();
        }
    }
} 

感谢 sfussenegger 的建议

于 2009-10-13T12:55:17.860 回答
17

使用ImageReader.getHeight(int)ImageReader.getWidth(int)通常只读取图像标题(我正在查看 JDK6 源)。所以ImageReader很可能是最好的选择。

于 2009-10-13T10:23:32.797 回答
1

你必须调查一下ImageReader.getImageMetadata()。不幸的是,Java Image API 并不容易使用。

您可以在javax.imageio.metadata.

有一些更容易使用的第三方库,例如MediaUtil(最近一次更新是在 3 年前,但对我来说效果很好)。

于 2009-10-13T10:17:48.117 回答
0

ImageInputStream 和 ImageReader 的解决方案仍然不是那么有效,因为它们创建了 tmp 文件。当图像更大或并发性更高时,它会变得更慢,我建议使用元数据提取器

于 2021-09-18T07:52:22.657 回答