首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 圖像處理實戰三部曲:裁剪、縮放、灰度化核心代碼詳解

     編輯:Java 程式設計入門

前置: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)

縮放提示常量

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 縮放/旋轉/剪切一氣呵成
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
常量速度品質適合場景
SCALE_DEFAULT中中通用
SCALE_FAST快低預覽、縮略圖
SCALE_SMOOTH慢高高質量輸出
SCALE_REPLICATE極快極低像素藝術、最近鄰
SCALE_AREA_AVERAGING慢高縮小時抗鋸齒