颜色算法:RGB与HSV(HSB)的相互转换

使用C#实现RGB与HSV(HSB)之间的转换

RGB转HSV(HSB)

在.NET中System.Drawing已经提供了从Color中获取色相、饱和度、亮度的方法。

/// <summary>
///     HSB转RBG
/// </summary>
/// <param name="rgb"></param>
/// <returns></returns>
public static float[] RgbToHsb(Color rgb)
{
    //获取色相
    var hue = rgb.GetHue();
    //获取饱和度
    var saturation = rgb.GetSaturation();
    //获取亮度
    var brightness = rgb.GetBrightness();
    return new float[] {hue, saturation, brightness};
}

继续阅读“颜色算法:RGB与HSV(HSB)的相互转换”

颜色算法:SRGB与线性RGB的相互转换

使用C#实现SRGB与线性RGB之间的转换

在一些涉及到图像颜色计算的算法时,由于一些效果是基于线性RBG进行计算的,直接对SRGB的图像进行处理就会得到错误的效果。

在本篇中,记录了SRGB与线性RGB之间的转换公式,方便在需要时使用。

SRGB转线性RGB

/// <summary>
///     将SRgb颜色转为线性RGB颜色
///     https://en.wikipedia.org/wiki/SRGB#The_forward_transformation_.28CIE_xyY_or_CIE_XYZ_to_sRGB.29
/// </summary>
/// <param name="sRgb">(单通道)颜色值 范围0-1</param>
/// <returns></returns>
public static double SRgbToLinearRgb(double sRgb)
{
    if (sRgb <= 0.04045) return sRgb / 12.92;

    return Math.Pow((sRgb + 0.055) / 1.055, 2.4);
}

线性RGB转SRGB

/// <summary>
///     将线性RGB颜色转为SRgb颜色
///     https://en.wikipedia.org/wiki/SRGB#The_forward_transformation_.28CIE_xyY_or_CIE_XYZ_to_sRGB.29
/// </summary>
/// <param name="linearRgb">(单通道)颜色值 范围0-1</param>
/// <returns></returns>
public static double LinearRgbToSRgb(double linearRgb)
{
    if (linearRgb < 0.0031308) return 12.92 * linearRgb;

    //var linearR=3.24096994*sR-1.53738318*sg-0.49861076*sb
    return Math.Pow(linearRgb, 1.0 / 2.4) * 1.055 - 0.055;
}