颜色算法: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};
}

HSV(HSB)转RGB

/// <summary>
///     HSV(HSB)转RBG
/// </summary>
/// <param name="hue">色相</param>
/// <param name="saturation">改变图像对比度 范围(0-1)</param>
/// <param name="value">改变图像对比度 范围(0-1)</param>
/// <returns></returns>
public static Color HsbToRgb(double hue, double saturation, double value)
{
    if (saturation == 0)
    {
        var defaultColor = (int) (value * 255);
        return Color.FromArgb(defaultColor, defaultColor, defaultColor);
    }

    var max = value < 0.5 ? value * (1 + saturation) : value * (1 - saturation) + saturation;
    var min = value * 2 - max;

    hue /= 360;
    return Color.FromArgb(GetSingleChannelColor(min, max, hue + 1.0 / 3),
        GetSingleChannelColor(min, max, hue),
        GetSingleChannelColor(min, max, hue - 1.0 / 3));
}

private static int GetSingleChannelColor(double min, double max, double hue)
{
    double singleColor;
    hue = (hue + 1) % 1;
    if (hue < 0)
    {
        hue += 1;
    }

    if (hue * 6 < 1)
    {
        singleColor = min + (max - min) * 6 * hue;
    }
    else if (hue * 2 < 1)
    {
        singleColor = max;
    }
    else if (hue * 3 < 2)
    {
        singleColor = min + (max - min) * 6 * (2.0 / 3 - hue);
    }
    else
    {
        singleColor = min;
    }

    return (int)(singleColor * 255);
}

本文会经常更新,请阅读原文:https://imxcg.com/technology/dot-net/conversion-between-rgb-and-hsv-or-hsb,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 仙尘阁 (包含链接: https://imxcg.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 (imxcg@foxmail.com)