我对目标c很新,但已经编程了一段时间.我开始创建一个可以从RGB转换为HSL然后再转换回来的函数,但我感觉它太长了并朝着错误的方向前进.有谁知道一种简单的方法来执行此转换?
所以我试图弄清楚如何计算颜色由HSL值表示的多个对象的平均色调.值得庆幸的是,我偶然发现了这个Stack Overflow帖子,并开始实现顶部答案中提供的算法(我在C++中工作).
不幸的是,我的实现似乎不起作用.在这里,它是完整的; 请注意,虽然我写了"Hue",但我按照初始实现使用角度(以度为单位)(从0-360角度切换到0-256色调,一旦我知道我的代码有效,就不应该很难).
#include <iostream>
#include <vector>
#include <cmath>
#define PI (4*atan(1))
int main()
{
///
/// Calculations adapted from this source:
/// https://stackoverflow.com/questions/8169654/how-to-calculate-mean-and-standard-deviation-for-hue-values-from-0-to-360
std::vector<double> Hues = {355, 5, 5, 5, 5};
//These will be used to store the sum of the angles
double X = 0.0;
double Y = 0.0;
//Loop through all H values
for (int hue = 0; hue < Hues.size(); ++hue)
{
//Add the X and Y values to the sum X and …Run Code Online (Sandbox Code Playgroud) 我在HSI(色调饱和度和强度)中有两个颜色值,我想要一个代表两种颜色之间视觉差异的数字.Hue是0到360之间的数字.饱和度为0到1,强度为0到1.
让我们考虑例如饱和度为100%的红色和蓝色以及100%的强度. 在此网站上可以通过输入以下文本来显示颜色.
红色是:hsv 0,100%,100%
蓝色是:hsv 240,100%,100%

显然,这是两种截然不同的颜色,因此我可以尝试计算颜色之间差异的一种简单方法是使用Hue组件并计算色调的绝对差值,因为360也等于120(360-240)色调为0.
问题出现在饱和度或强度很暗或很暗的地方,考虑一个非常深的红色和蓝色.
暗红色是:hsv 0,100%,20%
深蓝色是:hsv 240,100%20%

显然,这两种颜色之间的视觉差异小于鲜红色和蓝色,正如人们要求比较差异时所说的那样.我在这里的意思是,问一个朋友"哪一对颜色最不同?" 他们可能会说顶部明亮的红色蓝色.
我试图计算人类会注意到的两种颜色之间的差异.如果人类看到两种颜色a和b,然后是两种颜色c和d,他可以注意到哪些颜色最不同.首先,如果颜色是明亮的(但不是太亮),那么差异是基于色调的.如果颜色太亮,如白色或太暗,如黑色或太灰,则差异较小.
应该可以有一个函数diff,其中x = diff(a,b)和y = diff(c,d)产生x和y,我可以使用x和y来比较差异以找到最不同的颜色或最不同的颜色.
给定 HSL 中的某种颜色(假设 hsl(74,64%,59%)),我想计算哪种较暗的阴影(具有相同的 h 和 s 值)可以提供足够的对比度来满足 W3C 颜色对比度要求。
有一些公式可将 HSL 转换为 RGB(例如https://en.wikipedia.org/wiki/HSL_and_HSV#HSL_to_RGB)并计算该 RGB 的相对亮度(例如https://www.w3.org/TR /WCAG20/#relativeluminancedef)。根据颜色对比度公式(https://www.w3.org/TR/WCAG20/#contrast-ratiodef),我可以计算其他颜色的相对亮度应该是多少。
但是,然后我就卡住了。我发现无法从给定的相对亮度计算回具有给定 h 和 s 的 HSL 颜色。
使用https://contrast-ratio.com/等工具,我可以降低亮度直到满足要求,但我想要一个公式(最好在 JavaScript 中)来对大量颜色进行计算。
(我目前正在使用二分搜索方法来查找最接近的值,通过测试从 HSL 到 RGB 到相对亮度的许多转换,但这相当密集,而且我想知道中间到 RGB 的转换是否会引入不准确。)
我想要一个基本的 HSL 颜色值,我想将其实现为渐变,如下所示:
:root {
--hue: 201;
--saturation: 31;
--lightness: 40;
--mainColor: hsl(var(--hue),var(--saturation),var(--lightness));
--difference: 20; /* 0 + --difference < --lightness < 100 - --difference */
--lightnessPlus: calc(var(--lightness) + var(--difference));
--colorFrom: hsl(var(--hue),var(--saturation),var(--lightnessPlus));
--lightnessMinus: calc(var(--lightness) - var(--difference));
--colorTo: hsl(var(--hue),var(--saturation),var(--lightnessMinus));
}
[...]
.class {
background-image: linear-gradient(to right, var(--colorFrom), var(--colorTo));
}
Run Code Online (Sandbox Code Playgroud)
上面的代码产生了一个透明的对象,我无法理解为什么,请帮忙!
readJPEG()我使用包中的彩色 jpg 图像进行读取jpeg。现在我在 R 中将图像作为三维数组(宽度、高度、通道)。
我想将这些图像数组转换为 HSL 或 HSV 颜色空间,对图像进行变异,然后再次将它们保存为 RGB 格式的 JPG。然而,由于图像非常大(5000 x 8000),循环遍历每个单元格会非常耗时。我找到了可以快速将图像转换为 HSV 颜色空间的软件包OpenImageR,但是,我对“饱和度”通道中的大负值感到困惑。此外,该包不包含将图像转换回来的功能。
是否有任何软件包可以执行从 RGB 到 HSL 或 HSV(以及反向)的快速转换?或者有没有其他方法可以快速进行转换?
这些是我目前尝试按元素转换为一个方向的尝试:
# load packages
library(jpeg)
library(plotwidgets)
# load image
img <- readJPEG(img_path)
img <- img * 255
# new empty image
img_new <- array(NA, dim = dim(img))
# this takes way too long
for (img_row in 1:dim(img)[1]) {
for (img_col in 1:dim(img)[2]) {
img_new[img_row,img_col,] <- round(rgb2hsl(as.matrix(img[img_row,img_col,])))
}
}
# this takes also …Run Code Online (Sandbox Code Playgroud) 我希望能够确定浏览器是否支持HSL颜色,如果没有,那么我想回退生成的RGB颜色(我已生成).有没有办法在没有实际检查用户使用的浏览器的情况下这样做?
有谁知道可以将 HSL 颜色转换为 RGB 或十六进制的 PHP 函数(适用于 >5.3)?我已经尝试了十几次 Google 搜索,但我发现的所有功能都没有按预期工作。
该函数是转换为 RGB 还是十六进制并不重要,因为在这两者之间转换是微不足道的。输入是 CSS 的 HSL 值(色调:0-360,饱和度:0-100,亮度:0-100)。
编辑:指定输入和输出格式将是一个奖励:)
我有一个映射到 hsl 值的 Sass 变量。当我尝试将它与 hsla 一起使用来添加一点透明度时,不起作用。我正在这样做:
$white:hsl(100, 100%, 100%);
.thing{
color:hsla($white,.9);
}
Run Code Online (Sandbox Code Playgroud)
使用 gulp-sass 构建我的 CSS,我收到此错误:“在 {文件路径} 中的第 {行号} 行上调用函数 hsla 时缺少必需的参数 $lightness”
如果我用它替换它,hsla效果rgba很好,是的,我可以做到这一点,但我想将所有颜色保留在 hsl 中。有解决方法还是这是 Sass 问题?
我正在构建一个星型可视化引擎,需要插入从 API 接收到的值。HSL 色标为:
\n\n-.63, hsl: 228\xc2\xb0 100% 80%,\n.165, hsl: 224\xc2\xb0 100% 90%,\n.33, hsl: 240\xc2\xb0 100% 98%,\n.495, hsl: 64\xc2\xb0 100% 92%,\n.66, hsl: 52\xc2\xb0 100% 82%,\n.825, hsl: 28\xc2\xb0 100% 66%,\n2.057, hsl: 6\xc2\xb0 95% 65%,\nRun Code Online (Sandbox Code Playgroud)\n\n每颗星星都会返回 -.63 到 2.057 之间的颜色值,我需要一个函数来获取该值并沿着由上述停止点组成的光谱获取颜色。
\n\n我之前得到过一些帮助,但我一生都无法弄清楚这一点,并且无法找到插值 HSL 值的简明教程或演练。我能解决这个问题的唯一方法是通过外部库,但这对于相对简单的事情来说似乎是一个荒谬的解决方案。任何帮助,将不胜感激!
\n