本文目录导读:

- 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方法),避免运行时异常。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播