本文目录导读:

我帮你详细总结一下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);
}
}
注意事项
- 图片为空检查:
ImageIO.read()可能返回null,始终检查返回值 - 格式支持:默认只支持基本的图片格式,WebP、HEIC等需要额外库
- 质量设置:JPEG质量参数范围0.0-1.0,数值越大质量越好
- IO异常处理:文件读写可能抛出IOException
- 内存管理:大图片可能消耗大量内存,考虑使用缩略图或流式处理
扩展库推荐
如果需要支持更多格式:
<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-core</artifactId>
<version>3.9.4</version>
</dependency>
需要我详细介绍某个特定格式的处理或高级用法吗?