ImageIO 获取图片信息

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

  1. 获取图片流
  2. 获取图片读取对象
  3. 从图片读取对象中获取图片信息

获取图片流

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

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

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

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类型的

获取图片读取对象

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

    // 获取第一个图片读取对象
    ImageReader reader = iterable.next();
    // 设置读取的图片流
    reader.setInput(imageInputStream);
    return reader;
}

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

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

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

// 获取图片的数量
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,意思指的是图片的索引(也就是第几张图片),当文件是多图片文件时,如果获取图片的宽度或者高度,则需要指定获取哪张图片的宽度和高度,索引从0开始;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java ImageIO提供了压缩图片的功能,可以将高分辨率的图片压缩成低分辨率的图片以减少图片的大小。以下是一个示例代码,演示如何使用ImageIO压缩图片: ```java import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class ImageCompressor { public static void main(String[] args) throws IOException { File inputFile = new File("input.jpg"); File outputFile = new File("output.jpg"); BufferedImage inputImage = ImageIO.read(inputFile); // 压缩比例 float compressionRatio = 0.5f; // 计算压缩后的尺寸 int newWidth = (int) (inputImage.getWidth() * compressionRatio); int newHeight = (int) (inputImage.getHeight() * compressionRatio); // 创建压缩后的图片 BufferedImage outputImage = new BufferedImage(newWidth, newHeight, inputImage.getType()); // 绘制压缩后的图片 outputImage.createGraphics().drawImage( inputImage.getScaledInstance(newWidth, newHeight, java.awt.Image.SCALE_SMOOTH), 0, 0, null ); // 写入文件 ImageIO.write(outputImage, "jpg", outputFile); } } ``` 在上面的代码中,我们首先读取一个输入图片文件,并指定一个输出图片文件。然后我们计算压缩比例,根据压缩比例计算出新的图片尺寸。接着我们创建一个新的BufferedImage对象,指定新的尺寸和图片类型。最后我们使用`createGraphics()`方法获取到一个Graphics2D对象,并使用`drawImage()`方法将原始图片缩放到新的尺寸上,并绘制到新的BufferedImage对象上。最后我们使用`ImageIO.write()`方法将新的BufferedImage对象写入到输出文件中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值