測試三種常見演算法在 25% 飽和度調整下的效果:
| 演算法 | 原理 | 調節範圍 | 效果評價 |
|---|---|---|---|
| 簡單 RGB 閾值法 | >128 加值,<128 減值 | 極窄 | 失真嚴重,不可用 |
| HSV/HSL 模式 | 轉換色彩空間調整 S 分量 | 窄 | 出現色斑、顏色失真 |
| Photoshop HSB 模式 | HSL 空間取 S/L 為上下限,對 RGB 直接「補丁式」調整 | 寬廣、平滑 | 效果最佳、最自然 |
關鍵發現:
// 取得像素 R,G,B (0-255)
// 1. 計算 HSL 的 L (Lightness) 和 S (Saturation)
rgbMax = max(R,G,B) / 255.0
rgbMin = min(R,G,B) / 255.0
delta = rgbMax - rgbMin
if delta == 0: return // 純灰階,無飽和度可調
L = (rgbMax + rgbMin) / 2
if L < 0.5: S = delta / (rgbMax + rgbMin)
else: S = delta / (2 - rgbMax - rgbMin)
// 2. 飽和度調整量 sValue (-1.0 ~ +1.0)
if sValue > 0:
// 增強:指數式,防止超過 1.0
sValue = 1.0 / (1.0 - sValue) - 1.0
else:
// 減弱:線性
sValue = sValue // 負值
// 3. 直接修正 RGB(L 作為中性點)
R = R + (R - L*255) * sValue
G = G + (G - L*255) * sValue
B = B + (B - L*255) * sValue
// 4. 限制 0-255
clamp(R, 0, 255) 等
procedure PSSaturation(Data: TBitmapData; Value: Integer); // Value: -255 ~ +255
var L, sc, sv, width, off: Integer;
asm
// ... 完整 BASM 代碼見原文,關鍵點:
// 1. 直接操作像素緩衝區,無函數呼叫開銷
// 2. 整數運算模擬定點數,避免浮點指令
// 3. 迴圈展開處理 R/G/B 三通道
// 4. 邊界檢查內聯
end;
procedure GdiPPSSaturation(Bmp: TGpBitmap; Value: Integer);
var Data: TBitmapData;
begin
Data := Bmp.LockBits(GpRect(0,0,Bmp.Width,Bmp.Height), [imRead,imWrite], pf24bppRGB);
try
PSSaturation(Data, Value);
finally
Bmp.UnlockBits(Data);
end;
end;
RgbHsb.h/cpp:核心演算法(C++ 參考實現)main.cpp/h/dfm:VCL 表單,三軌條控制 H/S/B,即時預覽Bitmap/LockBits 直接操作像素緩衝區pf24bppRGB 格式,效能最佳此演算法實現了與 Photoshop **像素級一致** 的飽和度調整效果,是 Delphi/GDI+ 圖像處理庫的核心資產。