当前位置: 主页 > JAVA语言

java 获取文件夹图片-java获取webroot下的文件

发布时间:2023-04-01 07:12   浏览次数:次   作者:佚名

获取图片信息需要进行以后几步操作:

获取图片流获取图片读取对象从图片读取对象中获取图片信息获取图片流

图片流的获取可以通过File, InputStream, RandomAccessFile对象创建;

java获取resource文件_java获取webroot下的文件_java 获取文件夹图片

// 获取随机访问文件对象
RandomAccessFile randomAccessFile = new RandomAccessFile("/home/mointor/mobile.png", "r");
// 创建图片输入流对象
ImageInputStream imageInputStream = ImageIO.createImageInputStream(randomAccessFile);

为什么图片流的创建只能通过File, InputStream, RandomAccessFile对象创建呢?下面结合源代码看一下:

java获取resource文件_java 获取文件夹图片_java获取webroot下的文件

public static ImageInputStream createImageInputStream(Object input)
    throws IOException {
    // 如果输入的input为空,则抛出异常
    if (input == null) {
        throw new IllegalArgumentException("input == null!");
    }
    Iterator iter;
    // Ensure category is present
    try {
        /*
        从注册器中获取ImageInputStreamSpi类的实现,JDK中关于此类的实现有                                    
        (1) FileImageInputStreamSpi 对应的inputClass是File.class
        (2) InputStreamImageInputStreamSpi 对应的inputClass是InputStream.class
        (3) RAFImageInputStreamSpi 对应的inputClass是RandomAccessFile.class
        */
        iter = theRegistry.getServiceProviders(ImageInputStreamSpi.class,
                                                   true);
    } catch (IllegalArgumentException e) {
        return null;
    }
    boolean usecache = getUseCache() && hasCachePermission();
    // 遍历所有的ImageInputStreamSpi实现
    while (iter.hasNext()) {
        ImageInputStreamSpi spi = (ImageInputStreamSpi)iter.next();
        /*
           判断input对象是否是spi中inputClass的实例,如果是则使用spi创建图片流实例(查找能够处        
           理input对象的spi)
        */
        if (spi.getInputClass().isInstance(input)) {
            try {
                return spi.createInputStreamInstance(input,
                                                     usecache,
                                                     getCacheDirectory());
            } catch (IOException e) {
                throw new IIOException("Can't create cache file!", e);
            }
        }
    }
    // 如果未找到处理input对象的spi,则直接返回null
    return null;
}

从上面的代码逻辑中能看到JDK原生支持创建图片流对象的input对象只能是File, InputStream, RandomAccessFile类型的

java 获取文件夹图片_java获取webroot下的文件_java获取resource文件

获取图片读取对象

private ImageReader getImageReader(ImageInputStream imageInputStream) {
    // 获取所有能够读取图片的图片读取对象
    Iterator iterable = ImageIO.getImageReaders(imageInputStream);
    if(!iterable.hasNext()) {
        System.out.println("未找到适合的图片读取器");
        return null;
    }
    // 获取第一个图片读取对象
    ImageReader reader = iterable.next();
    // 设置读取的图片流
    reader.setInput(imageInputStream);
    return reader;
}

java获取webroot下的文件_java获取resource文件_java 获取文件夹图片

获取图片读取流时,返回的是一个迭代器,原因是读取这种类型的图片可能有多个图片读取器都能读取,所以会将所有能够读取此类型图片的图片读取器都返回,而我们用于读取图片的话则使用第一个读取器即可;

最后需要注意java 获取文件夹图片,上面的代码只是获取能够读取图片的读取器;获取后的读取器需要指定读取的图片流后才能使用;

java 获取文件夹图片_java获取resource文件_java获取webroot下的文件

从图片读取对象中获取图片信息

// 获取图片的数量
System.out.println("number: " + reader.getNumImages(true));
// 获取图片的宽度
System.out.println("width: " + reader.getWidth(0));
// 获取图片的宽度
System.out.println("height: " + reader.getHeight(0));
// 获取图片的格式
System.out.println("format name: " + reader.getFormatName());

不管是getWidth或者是getHeight都传递了一个参数0,此参数名称为imageIndex,意思指的是图片的索引(也就是第几张图片),当文件是多图片文件时,如果获取图片的宽度或者高度,则需要指定获取哪张图片的宽度和高度java 获取文件夹图片,索引从0开始;