本文目录导读:

- IIOParam 的常见设置项(基类层面)
- ImageReadParam(读取参数)
- ImageWriteParam(写入参数)
- 常见格式的特殊注意点
- 使用技巧:检查插件支持的能力
- 进阶:使用 ImageTypeSpecifier 控制输出类型
- 总结一句话
在 Java 的 Image I/O API(javax.imageio)中,IIOParam 是一个抽象基类,用于封装图像读写时的参数设置,它的两个主要子类是:
ImageReadParam(读取图像时使用)ImageWriteParam(写入图像时使用)
IIOParam 的常见设置项(基类层面)
这些属性和方法对所有图像格式(JPEG、PNG、TIFF 等)适用:
| 设置项(方法) | 作用 |
|---|---|
setSourceRegion(Rectangle region) |
仅读取/写入图像的部分区域(裁剪) |
setSourceSubsampling(int x, int y, int offsetX, int offsetY) |
像素下采样(跳读/跳写) |
setSourceBands(int[] bands) |
选择要操作的通道(只处理 RGB 中的 R 通道) |
setDestinationOffset(Point offset) |
设定写入目标图像时的偏移位置 |
setDestinationType(ImageTypeSpecifier type) |
指定输出的图像色彩类型 / 数据结构 |
ImageReadParam(读取参数)
常用于控制读取图像的精度、区域和速度。
ImageInputStream input = ImageIO.createImageInputStream(file);
ImageReader reader = ImageIO.getImageReaders(input).next();
reader.setInput(input);
// 设置读取参数
ImageReadParam param = reader.getDefaultReadParam();
// 1. 裁剪:只读取原图的 (10,10) 到 (100,100) 区域
param.setSourceRegion(new Rectangle(10, 10, 100, 100));
// 2. 下采样:每 2 像素取 1 个(缩小图像)
param.setSourceSubsampling(2, 2, 0, 0);
// 3. 只读取第 0,1 通道(去掉 Alpha 通道)
param.setSourceBands(new int[]{0, 1, 2});
// 4. 读取
BufferedImage image = reader.read(0, param);
ImageWriteParam(写入参数)
常用于控制压缩率、渐进式编码、写入区域。
ImageWriter writer = ImageIO.getImageWritersByFormatName("jpeg").next();
ImageWriteParam param = writer.getDefaultWriteParam();
// 1. 设置 JPEG 压缩质量
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(0.85f); // 0.0~1.0
// 2. 支持渐进式编码(PNG/JPEG 2000等)
param.setProgressiveMode(ImageWriteParam.MODE_DEFAULT);
// 3. 只写入图像的部分区域
param.setSourceRegion(new Rectangle(20, 20, 200, 200));
// 4. 写入时偏移目标位置
param.setDestinationOffset(new Point(50, 50));
常见格式的特殊注意点
| 格式 | 特别说明 |
|---|---|
| JPEG | 不支持 setSourceRegion 直接裁剪(除非先读入后写)可设置 compressionQuality不支持带透明通道 |
| PNG | 支持 setSourceRegion、setSourceBands不支持压缩质量设置(无损) 支持渐进式 |
| TIFF | 支持大部分参数设置,但不同插件行为有差异 可通过插件额外参数扩展 |
使用技巧:检查插件支持的能力
ImageWriteParam param = writer.getDefaultWriteParam();
if (param.canWriteCompressed()) {
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(0.8f);
}
if (param.canWriteProgressive()) {
param.setProgressiveMode(ImageWriteParam.MODE_DEFAULT);
}
if (param.isWriteRegionSupported()) {
param.setSourceRegion(new Rectangle(0, 0, 100, 100));
}
进阶:使用 ImageTypeSpecifier 控制输出类型
// 指定输出为 RGB(3 字节)类型,不带 Alpha
ImageTypeSpecifier type = ImageTypeSpecifier.createFromBufferedImageType(
BufferedImage.TYPE_3BYTE_BGR
);
param.setDestinationType(type);
总结一句话
IIOParam 是 Image I/O 中控制“读什么区域”、“缩放到多大”、“选择哪些通道”、“输出什么颜色类型”、“压缩率多少”等所有细节的配置对象。 使用时优先检查插件是否支持该特性(用
canXxx方法),避免运行时异常。