ImageIO 扩展原理

介绍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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值