ImageIO读写图片格式文件

wen java案例 1

本文目录导读:

ImageIO读写图片格式文件

  1. 基本用法
  2. 支持的格式
  3. 检查支持的格式
  4. 完整示例代码
  5. 注意事项
  6. 扩展库推荐

我帮你详细总结一下Java中ImageIO读写常见图片格式的方法。

基本用法

读取图片

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.InputStream;
import java.net.URL;
// 从文件读取
BufferedImage image = ImageIO.read(new File("image.jpg"));
// 从输入流读取
BufferedImage image = ImageIO.read(inputStream);
// 从URL读取
BufferedImage image = ImageIO.read(new URL("https://example.com/image.jpg"));

写入图片

// 写入为PNG
ImageIO.write(image, "png", new File("output.png"));
// 写入为JPEG
ImageIO.write(image, "jpg", new File("output.jpg"));
// 写入到输出流
ImageIO.write(image, "png", outputStream);

支持的格式

ImageIO默认支持的格式:

格式 读取 写入 说明
PNG 无损压缩,支持透明
JPEG/JPG 有损压缩,不支持透明
BMP 位图格式,文件较大
WBMP 无线应用位图
GIF 支持动画,只支持256色
TIFF 需插件 需插件 需添加JAI ImageIO

检查支持的格式

// 查看支持的读取格式
String[] readerFormats = ImageIO.getReaderFormatNames();
System.out.println("支持的读取格式: " + Arrays.toString(readerFormats));
// 查看支持的写入格式  
String[] writerFormats = ImageIO.getWriterFormatNames();
System.out.println("支持的写入格式: " + Arrays.toString(writerFormats));

完整示例代码

图片格式转换

public class ImageConverter {
    public static void convertFormat(String inputPath, String outputPath, String format) 
            throws IOException {
        File input = new File(inputPath);
        BufferedImage image = ImageIO.read(input);
        if (image == null) {
            System.out.println("无法读取图片: " + inputPath);
            return;
        }
        File output = new File(outputPath);
        boolean success = ImageIO.write(image, format, output);
        System.out.println(success ? "转换成功" : "转换失败");
    }
    // 使用示例
    public static void main(String[] args) throws IOException {
        convertFormat("input.png", "output.jpg", "jpg");
        convertFormat("input.jpg", "output.png", "png");
    }
}

批量处理图片

public class BatchImageProcessor {
    public static void batchConvert(String sourceDir, String targetDir, 
                                   String targetFormat) throws IOException {
        File dir = new File(sourceDir);
        File[] files = dir.listFiles((d, name) -> 
            name.toLowerCase().endsWith(".jpg") || 
            name.toLowerCase().endsWith(".png") ||
            name.toLowerCase().endsWith(".bmp"));
        if (files == null) return;
        for (File file : files) {
            // 读取图片
            BufferedImage image = ImageIO.read(file);
            if (image == null) continue;
            // 生成输出文件名
            String outputName = file.getName().replaceAll("\\.[^.]+$", "." + targetFormat);
            File outputFile = new File(targetDir, outputName);
            // 写入新格式
            ImageIO.write(image, targetFormat, outputFile);
            System.out.println("转换完成: " + file.getName() + " -> " + outputName);
        }
    }
}

带参数写入JPEG

import javax.imageio.*;
import javax.imageio.stream.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.Iterator;
public class JPEGWriterWithQuality {
    public static void writeJPEG(BufferedImage image, File output, float quality) 
            throws IOException {
        // 获取JPEG写入器
        Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg");
        if (!writers.hasNext()) {
            throw new IllegalStateException("没有JPEG写入器");
        }
        ImageWriter writer = writers.next();
        ImageOutputStream ios = ImageIO.createImageOutputStream(output);
        writer.setOutput(ios);
        // 设置压缩参数
        ImageWriteParam param = writer.getDefaultWriteParam();
        param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
        param.setCompressionQuality(quality); // 0.0 - 1.0
        // 写入图片
        writer.write(null, new IIOImage(image, null, null), param);
        // 清理资源
        ios.close();
        writer.dispose();
    }
    // 使用示例
    public static void main(String[] args) throws IOException {
        BufferedImage image = ImageIO.read(new File("input.png"));
        writeJPEG(image, new File("high_quality.jpg"), 0.95f);
        writeJPEG(image, new File("low_quality.jpg"), 0.2f);
    }
}

注意事项

  1. 图片为空检查ImageIO.read()可能返回null,始终检查返回值
  2. 格式支持:默认只支持基本的图片格式,WebP、HEIC等需要额外库
  3. 质量设置:JPEG质量参数范围0.0-1.0,数值越大质量越好
  4. IO异常处理:文件读写可能抛出IOException
  5. 内存管理:大图片可能消耗大量内存,考虑使用缩略图或流式处理

扩展库推荐

如果需要支持更多格式:

<dependency>
    <groupId>com.twelvemonkeys.imageio</groupId>
    <artifactId>imageio-core</artifactId>
    <version>3.9.4</version>
</dependency>

需要我详细介绍某个特定格式的处理或高级用法吗?

抱歉,评论功能暂时关闭!