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

GDI+ 進階議題:HSL 色彩空間轉換與像素級色彩修正實作

     編輯:關於.NET

8.1 原始像素法修改 RGB 與 HSL

最直接方式:LockBits 鎖定記憶體,逐像素修改 R/G/B 值。GDI+ Color 提供 GetHue()、GetSaturation()、GetBrightness() 取得 HSB 值(註:MSDN 註解錯誤標示為 HSB,實際回傳為 HSL)。

HSB/HSV 模型: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));
}

轉換公式來源:HSL 轉 RGB 數學公式

有了此函式,即可輕鬆調整飽和度、色相、亮度,但仍需 LockBits/UnlockBits 操作像素。下一節將介紹更優雅的 ColorMatrix 仿射變換法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved