ImageIO 读取图片

ImageIO提供了直接读取图片到内存的方式,同样,我们可以使用ImageReader读取文件到内存中进行使用;我们对两种方式进行介绍。

ImageReader读取

// 创建随机访问文件对象
RandomAccessFile randomAccessFile = new RandomAccessFile("/home/mointor/mobile.png", "r");
// 创建图片输入流
ImageInputStream imageInputStream = ImageIO.createImageInputStream(randomAccessFile);
// 获取图片读取器
Iterator<ImageReader> imageReaderIterator = ImageIO.getImageReaders(imageInputStream);
if(!imageReaderIterator.hasNext()) {
    // 未找到适合的图片读取器"
} else {
    ImageReader imageReader = imageReaderIterator.next();
    // 设置读取的图片
    imageReader.setInput(imageInputStream, true, true);
    // 读取图片到内存中
    BufferedImage bufferedImage = imageReader.read(0, imageReader.getDefaultReadParam());
    System.out.println("width: " + bufferedImage.getWidth());
    System.out.println("height: " + bufferedImage.getHeight());
}

我们是先获取到ImageReader对象,然后调用对象的read方法读取文件到内存中的,其中提供了两个参数,第一个参数指的是图片的索引(文件中的第几张图片),第二个参数指的是图片的读取参数(此时使用的是读取器默认的读取参数)

ImageIO读取

// 读取图片文件
BufferedImage bufferedImage = ImageIO.read(new File("/home/mointor/mobile.png"));
System.out.println("width: " + bufferedImage.getWidth());
System.out.println("height: " + bufferedImage.getHeight());

ImageIO提供了read方法用于直接将图片读取到内存中;read方法提供了多个重载,以满足从File,InputStream,URL,ImageInputStream中读取图片到内存中

其实ImageIO读取图片到内存中也是使用了ImageReader进行实现的,我们来看一下具体实现:

public static BufferedImage read(File input) throws IOException {
    if (input == null) {
        throw new IllegalArgumentException("input == null!");
    }
    // 判读是否可读
    if (!input.canRead()) {
        throw new IIOException("Can't read input file!");
    }

    // 创建图片输入流
    ImageInputStream stream = createImageInputStream(input);
    if (stream == null) {
        throw new IIOException("Can't create an ImageInputStream!");
    }
    // 读取图片到内存
    BufferedImage bi = read(stream);
    if (bi == null) {
        stream.close();
    }
    return bi;
}

public static BufferedImage read(ImageInputStream stream)
    throws IOException {
    if (stream == null) {
        throw new IllegalArgumentException("stream == null!");
    }

    // 获取图片读取器
    Iterator iter = getImageReaders(stream);
    if (!iter.hasNext()) {
        return null;
    }

    ImageReader reader = (ImageReader)iter.next();
    // 使用默认的图片读取参数
    ImageReadParam param = reader.getDefaultReadParam();
    // 设置读取的图片
    reader.setInput(stream, true, true);
    BufferedImage bi;
    try {
        // 读取图片到内存
        bi = reader.read(0, param);
    } finally {
        reader.dispose();
        stream.close();
    }
    return bi;
}

总结

ImageIO中提供的read方法,提供了多个重载目的是能够读取图片到内存中;其实现原理是使用ImageReader把图片读取到内存中。

### 使用 ImageIO 根据 URL 获取图片 为了从给定的 URL 中获取图像并处理其属性,在 Java 中可以利用 `ImageIO` 类来读取网络资源中的图像文件。下面展示了一个具体的方法实现,该方法能够接收一个表示图片位置的字符串参数,并返回对应的 `BufferedImage` 对象。 ```java public static BufferedImage initImage(String imageUrl) { try { URL url = new URL(imageUrl); URLConnection connection = url.openConnection(); connection.setDoOutput(true); return ImageIO.read(connection.getInputStream()); } catch (IOException e) { e.printStackTrace(); return null; } } ``` 上述代码片段定义了名为 `initImage` 的静态公共函数[^1]。此函数内部创建了一个指向目标地址的新 `URL` 实例,并尝试建立到服务器端口的数据传输通道;随后调用了 `ImageIO.read()` 方法传入输入流作为参数完成位图加载操作。如果过程中遇到任何 I/O 错误,则会打印堆栈跟踪信息并将结果设为空值。 当成功取得 `BufferedImage` 后,即可进一步访问图像的各种特性,比如尺寸大小: ```java Map<String, String> getImageDimensions(String imgUrl){ Map<String, String> map = new HashMap<>(); BufferedImage image = getBufferedImage(imgUrl); if (image != null) { map.put("Height", String.valueOf(image.getHeight())); map.put("Width", String.valueOf(image.getWidth())); } else { System.out.println("图片不存在!"); } return map; } ``` 这段扩展逻辑展示了如何封装成一个新的辅助功能——`getImageDimensions` 来查询远程图片的具体规格数据[^3]。它不仅实现了基本的高度宽度提取工作,还加入了简单的错误检测机制用于应对可能存在的无效链接情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值