在介绍ImageIO时,我们使用 getReaderFormatNames 和 getWriterFormatNames 获取到了ImageIO支持读取、写入的图片格式;
Jdk中提供的支持读取、写入的图片格式如下:jpg, bmp, gif, png, jpeg, wbmp
但是还有一些图片格式是Jdk未提供的,下面我们介绍一下ImageIO读取、写入图片的原理。
ImageIO.getReaderFormatNames
我们以getReaderFormatNames为切入点进行代码分析:
// 获取读取器图片格式名称
public static String[] getReaderFormatNames() {
// 获取读写信息
// 第一个参数传递的是ImageReaderSpi(图片读取SPI),
// 第二个参数传递的是SpiInfo.FORMAT_NAMES, 从下面SpiInfo的定义来看, SpiInfo.FORMAT_NAMES用于获取格式名称
return getReaderWriterInfo(ImageReaderSpi.class,
SpiInfo.FORMAT_NAMES);
}
// SpiInfo是一个枚举类型
private static enum SpiInfo {
FORMAT_NAMES {
// 用于获取格式
@Override
String[] info(ImageReaderWriterSpi spi) {
return spi.getFormatNames();
}
},
MIME_TYPES {
// 用于获取媒体类型
@Override
String[] info(ImageReaderWriterSpi spi) {
return spi.getMIMETypes();
}
},
FILE_SUFFIXES {
// 用于获取文件后缀(扩展名)
@Override
String[] info(ImageReaderWriterSpi spi) {
return spi.getFileSuffixes();
}
};
// 用于获取信息,参数是ImageReaderWriterSpi类型, ImageReadSpi是其一个子类
abstract String[] info(ImageReaderWriterSpi spi);
}
getReaderFormatNames 方法调用了 getReaderWriterInfo 方法:
private static <S extends ImageReaderWriterSpi>
String[] getReaderWriterInfo(Class<S> spiClass, SpiInfo spiInfo)
{
// Ensure category is present
Iterator<S> iter;
try {
// 从注册器中获取服务提供者
iter = theRegistry.getServiceProviders(spiClass, true);
} catch (IllegalArgumentException e) {
return new String[0];
}
HashSet<String> s = new HashSet<String>();
// 遍历服务提供者,并调用SpiInfo获取信息(获取格式名称)的方法将获取到的信息添加到集合中
while (iter.hasNext()) {
ImageReaderWriterSpi spi = iter.next();
Collections.addAll(s, spiInfo.info(spi));
}
// 返回格式名称集合
return s.toArray(new Str