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把图片读取到内存中。