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

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

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