RGB 到 HSL 转换

2024-02-11

我正在创建一个颜色选择器工具,对于 HSL 滑块,我需要能够将 RGB 转换为 HSL。当我搜索 SO 进行转换的方法时,我发现了这个问题HSL 到 RGB 颜色转换 https://stackoverflow.com/questions/2353211/hsl-to-rgb-color-conversion.

虽然它提供了从 RGB 到 HSL 的转换功能,但我没有看到对计算中实际情况的解释。为了更好地理解它,我阅读了HSL 和 HSV https://en.wikipedia.org/wiki/HSL_and_HSV在维基百科上。

后来,我使用“HSL 和 HSV”页面中的计算重写了“HSL 到 RGB 颜色转换”的函数。

如果 R 是最大值,我就会陷入色调的计算。请参阅“HSL 和 HSV”页面中的计算:

这是来自另一个维基页面 https://nl.wikipedia.org/wiki/HSL_(kleurruimte)#Omzetting_van_RGB_naar_HSL这是荷兰语:

这是来自answers https://stackoverflow.com/a/9493060/2202732到“HSL 到 RGB 颜色转换”:

case r: h = (g - b) / d + (g < b ? 6 : 0); break; // d = max-min = c

我已经用一些 RGB 值测试了所有三个,它们似乎产生了相似的(如果不精确)结果。我想知道他们在做同样的事情吗?对于某些特定的 RGB 值会得到不同的结果吗?我应该使用哪一个?

hue = (g - b) / c;                   // dutch wiki
hue = ((g - b) / c) % 6;             // eng wiki
hue = (g - b) / c + (g < b ? 6 : 0); // SO answer
function rgb2hsl(r, g, b) {
    // see https://en.wikipedia.org/wiki/HSL_and_HSV#Formal_derivation
    // convert r,g,b [0,255] range to [0,1]
    r = r / 255,
    g = g / 255,
    b = b / 255;
    // get the min and max of r,g,b
    var max = Math.max(r, g, b);
    var min = Math.min(r, g, b);
    // lightness is the average of the largest and smallest color components
    var lum = (max + min) / 2;
    var hue;
    var sat;
    if (max == min) { // no saturation
        hue = 0;
        sat = 0;
    } else {
        var c = max - min; // chroma
        // saturation is simply the chroma scaled to fill
        // the interval [0, 1] for every combination of hue and lightness
        sat = c / (1 - Math.abs(2 * lum - 1));
        switch(max) {
            case r:
                // hue = (g - b) / c;
                // hue = ((g - b) / c) % 6;
                // hue = (g - b) / c + (g < b ? 6 : 0);
                break;
            case g:
                hue = (b - r) / c + 2;
                break;
            case b:
                hue = (r - g) / c + 4;
                break;
        }
    }
    hue = Math.round(hue * 60); // °
    sat = Math.round(sat * 100); // %
    lum = Math.round(lum * 100); // %
    return [hue, sat, lum];
}

我一直在阅读几个 wiki 页面并检查不同的计算,并创建 RGB 立方体投影到六边形上的可视化。我想发表我对这种转换的理解。由于我发现这种转换(使用几何形状表示颜色模型)很有趣,因此我将尽力做到彻底。首先,我们从 RGB 开始。

RGB

嗯,这确实不需要太多解释。最简单的形式是,有 3 个值:R、G 和 B,范围为 [0,255]。例如,51,153,204。我们可以用条形图来表示:

RGB Cube

我们还可以在 3D 空间中表示颜色。我们有三个价值观R, G, B对应于X, Y, and Z。所有三个值都在[0,255]范围,这会产生一个立方体。但在创建 RGB 立方体之前,我们先处理 2D 空间。 R、G、B 的两种组合给出:RG、RB、GB。如果我们将它们绘制在平面上,我们会得到以下结果:

这是 RGB 立方体的前三个面。如果我们将它们放置在 3D 空间上,则会产生一个半立方体:

如果你检查上图,通过混合两种颜色,我们会在 (255,255) 处得到一种新颜色,它们是黄色、洋红色和青色。同样,这些的两个组合给我们:YM、YC 和 MC。这些是立方体的缺失面。一旦我们添加它们,我们就得到了一个完整的立方体:

以及位置51,153,204在这个立方体中:

RGB 立方体在六边形上的投影

现在我们有了 RGB 立方体,让我们将其投影到六边形上。首先,我们将立方体倾斜 45°x,然后 35.264°y。第二次倾斜后,黑角在底部,白角在顶部,它们都穿过z axis.

正如您所看到的,当我们从顶部观察立方体时,我们得到了我们想要的具有正确色调顺序的六边形外观。但我们需要将其投影到真正的六边形上。我们要做的就是画一个与立方体顶视图大小相同的六边形。六边形的所有角都对应于立方体的角和颜色,立方体的顶角(白色)投影到六边形的中心。黑色被省略。如果我们将每种颜色映射到六边形上,我们就会得到正确的外观。

以及位置51,153,204在六边形上将是:

计算色调

在进行计算之前,我们先定义一下什么是色调。

色调大致是矢量与投影中一点的角度,红色为 0°。

...色调是该点在六边形边缘周围的距离。

这是从以下计算得出的HSL 和 HSV https://en.wikipedia.org/wiki/HSL_and_HSV#Hue_and_chroma维基页面。我们将在本说明中使用它。

检查六边形及其位置51,153,204 on it.

首先,我们缩放 R、G、B 值以填充 [0,1] 区间。

R = R / 255    R =  51 / 255 = 0.2
G = G / 255    G = 153 / 255 = 0.6
B = B / 255    B = 204 / 255 = 0.8

接下来,找到max and min的值R, G, B

M = max(R, G, B)    M = max(0.2, 0.6, 0.8) = 0.8
m = min(R, G, B)    m = min(0.2, 0.6, 0.8) = 0.2

然后,计算C(色度)。色度定义为:

... 色度大致是点到原点的距离。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RGB 到 HSL 转换 的相关文章

随机推荐

  • 从 Properties 获取 int、float、boolean 和 string

    我有属性文件中的 int float boolean 和 string 一切都已加载到属性中 目前 我正在解析值 因为我知道特定键的预期值 Boolean parseBoolean false Integer parseInt 3 如果我不
  • X++ 中的“this”与“element”关键字

    在 X 中编写代码时有时需要引用this functionYouWant 有时是element FunctionYouWant 有时两者都在范围内 我经常尝试其中一种 如果没有我想要的功能 我会尝试另一种 是否有规则解释何时使用this以及
  • yeoman 在桌面中创建项目,即使我 CD 进入目录

    I am having a issue creating a yeoman project I cd in the directory type yo and it says Here is it suppose to asked me p
  • 如何在 SAPI 5.4 C# 程序中加载文本语法?

    我一直在 SAPI 5 4 中使用 SRGS 语法来定义命令和控制语法 现在我想切换到文本语法 以便它们与 SAPI 5 1 甚至可能是 SAPI 4 兼容 我找到了一个例子SAPI 5 4 兼容文本语法在这里 http msdn micr
  • 用于提取 TwitPic 链接/代码(如果存在)的 PHP 正则表达式

    我希望能够检查文本字符串并提取 TwitPic URL 如果它存在于字符串中 最终我只想要代码部分 但两者都可以 Example blah blah blah http twitpic com 1aso4q blah blah 期望的结果
  • 库链接

    我正在尝试使用 Zed Shaw 的 Learn C the Hard way 来学习 C 编程 我一直在 ex26 上工作 我们创建了一个用于安装软件的程序 devpkg 此练习需要安装 Apache Portable Runtime 库
  • 无序元组类型

    我只是在深入研究 Typescript 类型 我想知道如何定义一个元组类型 但具有无序元素类型 我的意思是 有 type SimpleTuple number string const tup1 SimpleTuple 7 7 Valid
  • 调用 Math.random() 的函数是纯函数吗?

    以下是纯函数吗 function test min max return Math random max min min 我的理解是纯函数遵循以下条件 它返回一个根据参数计算得出的值 除了计算返回值之外 它不做任何工作 如果这个定义是正确的
  • 如何在 Jersey/Spring 中使用 @QueryParam 重载方法?

    我想使用 QueryParam 重载一个方法 但每次我尝试执行此代码时 它都会抛出 SEVERE Exception occurred when intialization com sun jersey spi inject Errors
  • Matplotlib,绘图上的对数色标,但颜色条图例上的线性色标

    我想以对数比例绘制 我已经使用以下方法完成了 plt contourf cube 0 data levels np arange 0 6000 10 norm mplc LogNorm 但我希望颜色条仍然是线性比例 这可能吗 如果可以的话我
  • Server.MapPath 并从 ASP.NET 应用程序运行命令行实用程序

    我需要使用 ASP NET 应用程序运行可执行文件Process exe 文件位于 ASP NET 项目内 ProjectRoot Utilities utility exe 为什么这段代码运行失败 string path Server M
  • 使用路径相关类型作为类参数

    我想要一个类 它采用依赖于类的类型的参数 就像我经常对方法所做的那样 然而 令我惊讶的是 这不起作用 scala gt trait Compiler trait Config defined trait Compiler works fin
  • 如何使用 JWT 令牌管理多设备同时登录?

    我的疑问是关于使用 JWT 令牌支持同一用户同时进行多设备登录 我使用 NestJS 作为我的后端 用户表 userid 用户名 密码 包含哈希密码 名称 refreshToken 包含哈希刷新令牌 当用户执行 api login 调用时
  • HOC 上的组件定义缺少显示名称

    我正在尝试创建一个更高阶的组件 但不断收到此 eslint 警告 组件定义缺少显示名称 我尝试添加如下所示的显示名称 但它仍然抱怨 import React from react const HOC props gt WC gt WC di
  • 以编程方式更改 Android 中矢量的 fillColor

    我想以编程方式编辑 Android 中矢量文件的填充颜色 在 xml 文件中 我可以使用属性设置颜色机器人 填充颜色但我想在运行时改变颜色 有什么例子吗 谢谢 This https medium com emmaguy dynamicall
  • 尝试使用 imagecreatefromstring 保存 base64 图像,但它是全黑的

    我正在尝试从数据库中获取 Base64 编码图像并将其保存到文件中 无论出于何种原因 当我尝试使用 imagecreatefromstring 和 imagepng 时 图像完全是黑色的 我尝试了很多不同的方法 但最终还是得到了一个黑匣子
  • msbuild复制文件

    我在使用 MSbuild 复制文件时遇到问题 并且收到的错误消息似乎相互矛盾 使用 TFS 2008 进行构建 我目前的构建脚本中有以下内容
  • EL 表达式:传递 null 作为 BigDecimal 字段的值

    我有课BigDecimal财产 当我绑定到它 EL 表达式并传递 null 时 valueExpression set context null 财产的新价值变为BigDecimal ZERO 有什么方法可以将 null 传递给BigDec
  • 如何在 C# 中将视频转换为字节数组?

    我正在使用 c net 紧凑框架 3 5 我想将视频文件转换为字节数组 以便我可以将其上传到服务器上 以类似的方式 我正在进行图像上传 获得了成功的结果 HttpWebRequest request request ContentType
  • RGB 到 HSL 转换

    我正在创建一个颜色选择器工具 对于 HSL 滑块 我需要能够将 RGB 转换为 HSL 当我搜索 SO 进行转换的方法时 我发现了这个问题HSL 到 RGB 颜色转换 https stackoverflow com questions 23