为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用Java获取图像的高度和宽度?

如何使用Java获取图像的高度和宽度?

牛魔王的故事 2019-10-16 14:45:58
除了使用ImageIO.read来获取图像的高度和宽度外,还有其他方法吗?因为我遇到了锁定线程的问题。at com.sun.medialib.codec.jpeg.Decoder.njpeg_decode(Native Method)      at com.sun.medialib.codec.jpeg.Decoder.decode(Decoder.java:87)      at com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReader.decode(CLibJPEGImageReader.java:73)      - locked <0xd96fb668> (a com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReader)      at com.sun.media.imageioimpl.plugins.clib.CLibImageReader.getImage(CLibImageReader.java:320)     - locked <0xd96fb668> (a com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReader)      at com.sun.media.imageioimpl.plugins.clib.CLibImageReader.read(CLibImageReader.java:384)    - locked <0xd96fb668> (a com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReader)      at javax.imageio.ImageIO.read(ImageIO.java:1400)      at javax.imageio.ImageIO.read(ImageIO.java:1322)此错误仅在Sun应用服务器上发生,因此我怀疑这是Sun错误。
查看完整描述

3 回答

?
杨魅力

TA贡献1811条经验 获得超6个赞

这是@Kay对伟大帖子的重写,它引发IOException并提供了较早的退出:


/**

 * Gets image dimensions for given file 

 * @param imgFile image file

 * @return dimensions of image

 * @throws IOException if the file is not a known image

 */

public static Dimension getImageDimension(File imgFile) throws IOException {

  int pos = imgFile.getName().lastIndexOf(".");

  if (pos == -1)

    throw new IOException("No extension for file: " + imgFile.getAbsolutePath());

  String suffix = imgFile.getName().substring(pos + 1);

  Iterator<ImageReader> iter = ImageIO.getImageReadersBySuffix(suffix);

  while(iter.hasNext()) {

    ImageReader reader = iter.next();

    try {

      ImageInputStream stream = new FileImageInputStream(imgFile);

      reader.setInput(stream);

      int width = reader.getWidth(reader.getMinIndex());

      int height = reader.getHeight(reader.getMinIndex());

      return new Dimension(width, height);

    } catch (IOException e) {

      log.warn("Error reading: " + imgFile.getAbsolutePath(), e);

    } finally {

      reader.dispose();

    }

  }


  throw new IOException("Not a known image file: " + imgFile.getAbsolutePath());

}

我想我的代表不够高,因此我的意见不值得作为回应。


查看完整回答
反对 回复 2019-10-16
?
绝地无双

TA贡献1946条经验 获得超4个赞

我发现了另一种读取图像大小的方法(更通用)。您可以将ImageIO类与ImageReaders一起使用。这是示例代码:


private Dimension getImageDim(final String path) {

    Dimension result = null;

    String suffix = this.getFileSuffix(path);

    Iterator<ImageReader> iter = ImageIO.getImageReadersBySuffix(suffix);

    if (iter.hasNext()) {

        ImageReader reader = iter.next();

        try {

            ImageInputStream stream = new FileImageInputStream(new File(path));

            reader.setInput(stream);

            int width = reader.getWidth(reader.getMinIndex());

            int height = reader.getHeight(reader.getMinIndex());

            result = new Dimension(width, height);

        } catch (IOException e) {

            log(e.getMessage());

        } finally {

            reader.dispose();

        }

    } else {

        log("No reader found for given format: " + suffix));

    }

    return result;

}

请注意,getFileSuffix是返回路径扩展名而不包含“。”的方法。因此例如:png,jpg等。示例实现为:


private String getFileSuffix(final String path) {

    String result = null;

    if (path != null) {

        result = "";

        if (path.lastIndexOf('.') != -1) {

            result = path.substring(path.lastIndexOf('.'));

            if (result.startsWith(".")) {

                result = result.substring(1);

            }

        }

    }

    return result;

}

该解决方案非常快,因为仅从文件读取图像大小,而不是从整个图像读取。我对其进行了测试,无法与ImageIO.read的性能进行比较。我希望有人会觉得有用。


查看完整回答
反对 回复 2019-10-16
  • 3 回答
  • 0 关注
  • 1323 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信