IIOParam参数设置对象

wen java案例 2

本文目录导读:

IIOParam参数设置对象

  1. IIOParam 的常见设置项(基类层面)
  2. ImageReadParam(读取参数)
  3. ImageWriteParam(写入参数)
  4. 常见格式的特殊注意点
  5. 使用技巧:检查插件支持的能力
  6. 进阶:使用 ImageTypeSpecifier 控制输出类型
  7. 总结一句话

在 Java 的 Image I/O APIjavax.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 支持 setSourceRegionsetSourceBands
不支持压缩质量设置(无损)
支持渐进式
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 方法),避免运行时异常。

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