前置:Image 生產者/消費者模型
ImageProducer:像素數據源 (FilteredImageSource、MemoryImageSource)
ImageConsumer:像素數據接收端 (Image 實現)
ImageFilter:坐中間加工像素流 (CropImageFilter、RGBImageFilter、AreaAveragingScaleFilter)
Toolkit.createImage(ImageProducer):組裝管道產出新 Image
1. 圖像裁剪
import java.awt.*;
import java.awt.image.*;
Image croppedImage;
ImageFilter cropFilter = new CropImageFilter(x, y, width, height);
// 參數:源圖左上角座標 (x,y) + 目標寬高
croppedImage = Toolkit.getDefaultToolkit().createImage(
new FilteredImageSource(sourceImage.getSource(), cropFilter)
);
// 在 Component 子類中可用 this.createImage(...)
適用:從大圖提取圖標、瓦片地圖、精靈圖集切分。
2. 圖像縮放
// 核心 API:Image.getScaledInstance(w, h, hints)
Image scaled = sourceImage.getScaledInstance(100, 100, Image.SCALE_DEFAULT); // 固定尺寸
Image doubled = sourceImage.getScaledInstance(
sourceImage.getWidth(this) * 2,
sourceImage.getHeight(this) * 2,
Image.SCALE_DEFAULT
); // 放大 2 倍 (this 為 ImageObserver)
縮放提示常量
| 常量 | 速度 | 品質 | 適合場景 |
SCALE_DEFAULT | 中 | 中 | 通用 |
SCALE_FAST | 快 | 低 | 預覽、縮略圖 |
SCALE_SMOOTH | 慢 | 高 | 高質量輸出 |
SCALE_REPLICATE | 極快 | 極低 | 像素藝術、最近鄰 |
SCALE_AREA_AVERAGING | 慢 | 高 | 縮小時抗鋸齒 |
3. 灰度化變換:三種算法對比
核心類:RGBImageFilter + 自定義 ColorModel
算法 1:最大值法
gray = max(R, G, B)
特點:保留高亮細節,對比度高,適合文檔掃描。
算法 2:加權平均法 (ITU-R BT.601)
gray = 0.299*R + 0.587*G + 0.114*B
特點:符合人眼亮度感知,視覺最自然,視頻/圖片標準。
算法 3:JDK 內建 ColorModel 轉換
ColorConvertOp 或 GrayFilter (內部實現),效果介於兩者間。
完整可復用組件:GrayFilter
public class GrayFilter extends RGBImageFilter {
public static final int MODE_MAX = 0;
public static final int MODE_WEIGHTED = 1;
private final int mode;
public GrayFilter(int mode) {
this.mode = mode;
canFilterIndexColorModel = true; // 支援索引色模型
}
@Override
public void setColorModel(ColorModel model) {
if (mode == MODE_MAX) {
substituteColorModel(model, new MaxGrayModel(model));
} else {
substituteColorModel(model, new WeightedGrayModel(model));
}
}
@Override
public int filterRGB(int x, int y, int rgb) {
return rgb; // 實際轉換在 ColorModel 中完成
}
}
// 最大值 ColorModel
class MaxGrayModel extends ColorModel {
private final ColorModel src;
MaxGrayModel(ColorModel src) { super(src.getPixelSize()); this.src = src; }
@Override public int getRed(int pixel) { int g = getGray(pixel); return g; }
@Override public int getGreen(int pixel) { int g = getGray(pixel); return g; }
@Override public int getBlue(int pixel) { int g = getGray(pixel); return g; }
private int getGray(int pixel) {
return Math.max(src.getRed(pixel), Math.max(src.getGreen(pixel), src.getBlue(pixel)));
}
// 其餘方法委託 src...
}
// 加權 ColorModel 類似,getGray 實現加權公式
使用範例
Image grayImage = Toolkit.getDefaultToolkit().createImage(
new FilteredImageSource(sourceImage.getSource(), new GrayFilter(GrayFilter.MODE_WEIGHTED))
);
效能提示
- 大圖處理用
BufferedImage 直接操作像素陣列 (getRaster()),避免 Filter 鏈開銷
- 批量處理復用
ColorModel 實例
- Java 2D 進階:
Graphics2D.drawImage() + AffineTransform 縮放/旋轉/剪切一氣呵成
- 上一篇文章: Unix 打印服務器進階配置:lpadmin 統一處理文本、PostScript、PCL/RTL 多格式輸出
- 下一篇文章: J2EE Web 服務質量監控:服務端 Tie 類注入統計代碼實現調用計數
Copyright ©
程式碼之家 All Rights Reserved