最直接方式:LockBits 鎖定記憶體,逐像素修改 R/G/B 值。GDI+ Color 提供 GetHue()、GetSaturation()、GetBrightness() 取得 HSB 值(註:MSDN 註解錯誤標示為 HSB,實際回傳為 HSL)。
HSB/HSV 模型:
GDI+ 缺少 Color.FromHSL 靜態方法,需自行實作 HSL→RGB 轉換:
private Color FromHSL(float hue, float saturation, float lightness)
{
double q = lightness < 0.5 ? lightness * (1 + saturation) : lightness + saturation - lightness * saturation;
double p = 2 * lightness - q;
double hk = hue / 360.0;
double[] t = { hk + 1.0/3, hk, hk - 1.0/3 };
for (int i = 0; i < 3; i++) {
if (t[i] < 0) t[i] += 1;
if (t[i] > 1) t[i] -= 1;
}
double[] color = new double[3];
for (int i = 0; i < 3; i++) {
if (t[i] < 1.0/6) color[i] = p + (q - p) * 6 * t[i];
else if (t[i] < 0.5) color[i] = q;
else if (t[i] < 2.0/3) color[i] = p + (q - p) * 6 * (2.0/3 - t[i]);
else color[i] = p;
}
return Color.FromArgb(0,
(int)Math.Round(color[0] * 255),
(int)Math.Round(color[1] * 255),
(int)Math.Round(color[2] * 255));
}
轉換公式來源:
有了此函式,即可輕鬆調整飽和度、色相、亮度,但仍需 LockBits/UnlockBits 操作像素。下一節將介紹更優雅的 ColorMatrix 仿射變換法。