- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个拾色器工具,对于 HSL 滑块,我需要能够将 RGB 转换为 HSL。当我搜索 SO 进行转换的方法时,我发现了这个问题 HSL to RGB color conversion .
虽然它提供了一个函数来进行从 RGB 到 HSL 的转换,但我看不到对计算中真正发生了什么的解释。为了更好地理解它,我阅读了 HSL and HSV在维基百科上。
后来,我使用“HSL 和 HSV”页面中的计算重写了“HSL 到 RGB 颜色转换”中的函数。
如果 R 是最大值,我就会陷入色调的计算。请参阅“HSL 和 HSV”页面中的计算:
这是来自另一个 wiki page那是荷兰语:
这是来自 answers到“HSL 到 RGB 颜色转换”:
case r: h = (g - b) / d + (g < b ? 6 : 0); break; // d = max-min = c
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立方体
我们还可以在 3D 空间中表示一种颜色。我们有三个值 R
, G
, B
对应于 X
, Y
, 和 Z
.所有三个值都在 [0,255]
中范围,结果是一个立方体。但在创建 RGB 立方体之前,让我们先处理 2D 空间。 R、G、B 的两种组合为我们提供:RG、RB、GB。如果我们在平面上绘制这些图形,我们会得到以下结果:
这些是 RGB 立方体的前三个面。如果我们将它们放置在 3D 空间中,则会产生一个半立方体:
如果您查看上图,通过混合两种颜色,我们会在 (255,255) 处获得一种新颜色,它们是黄色、洋红色和青色。同样,这些的两个组合给了我们:YM、YC 和 MC。这些是立方体的缺失面。一旦我们添加它们,我们就会得到一个完整的立方体:
以及51,153,204
的位置在这个立方体中:
RGB Cube 投影到六边形上
现在我们有了 RGB 立方体,让我们把它投影到一个六边形上。首先,我们将立方体在 x
上倾斜 45°。 ,然后是 y
上的 35.264° .第二次倾斜后,黑色角在底部,白色角在顶部,它们都穿过z
轴。
正如你所看到的,当我们从顶部看立方体时,我们得到了我们想要的六边形外观和正确的色调顺序。但是我们需要把它投影到一个真正的六边形上。我们所做的是绘制一个与立方体顶 View 大小相同的六边形。六边形的所有角对应立方体的角和颜色,立方体的顶角为白色,投影到六边形的中心。黑色省略。如果我们将每种颜色映射到六边形上,我们就会得到正确的外观。
以及51,153,204
的位置在六边形上将是:
计算色调
在我们进行计算之前,让我们先定义什么是色调。
Hue is roughly the angle of the vector to a point in the projection, with red at 0°.
... hue is how far around that hexagon’s edge the point lies.
51,153,204
的六边形和位置在上面。
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
和
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
(色度)。色度定义为:
... chroma is roughly the distance of the point from the origin.
Chroma is the relative size of the hexagon passing through a point ...
C = OP / OP'
C = M - m
C = 0.8- 0.2 = 0.6
R
,
G
,
B
, 和
C
值。如果我们检查条件,
if M = B
51,153,204
返回真.所以,我们将使用
H'= (R - G) / C + 4
.
(R - G) / C
给我们
BP
的长度部分。
segment = (R - G) / C = (0.2 - 0.6) / 0.6 = -0.6666666666666666
RY
,如果为负,则应该在
RM
.在这种情况下,它是负的
-0.6666666666666666
,并在
RM
上边缘。
P₁
对战
B
(因为
M = B
)。蓝色在
240°
.六边形有6个边。每边对应
60°
.
240 / 60 = 4
.我们需要移动(增加)
P₁
来自
4
(这是 240°)。换类后,
P₁
将在
P
我们将得到
RYGCP
的长度.
segment = (R - G) / C = (0.2 - 0.6) / 0.6 = -0.6666666666666666
RYGCP = segment + 4 = 3.3333333333333335
6
对应于
360°
.
53,151,204
到
0°
的距离是
3.3333333333333335
.如果我们乘以
3.3333333333333335
来自
60
,我们将得到它的位置(以度为单位)。
H' = 3.3333333333333335
H = H' * 60 = 200°
if M = R
的情况下,因为我们将线段的一端放置在 R (0°),如果线段长度为正,我们不需要将线段移动到 R。
P₁
的位置将是积极的。但是如果段长为负,我们需要将其移动6,因为负值意味着角位置大于180°,我们需要做一个完整的旋转。
hue = (g - b) / c;
也不是 Eng wiki 解决方案
hue = ((g - b) / c) % 6;
将适用于负段长度。只有 SO 答案
hue = (g - b) / c + (g < b ? 6 : 0);
适用于负值和正值。
console.log(rgb2hue(51,153,204));
console.log(rgb2hue(255,71,99));
console.log(rgb2hue(255,0,0));
console.log(rgb2hue(255,128,0));
console.log(rgb2hue(124,252,0));
function rgb2hue(r, g, b) {
r /= 255;
g /= 255;
b /= 255;
var max = Math.max(r, g, b);
var min = Math.min(r, g, b);
var c = max - min;
var hue;
if (c == 0) {
hue = 0;
} else {
switch(max) {
case r:
var segment = (g - b) / c;
var shift = 0 / 60; // R° / (360° / hex sides)
if (segment < 0) { // hue > 180, full rotation
shift = 360 / 60; // R° / (360° / hex sides)
}
hue = segment + shift;
break;
case g:
var segment = (b - r) / c;
var shift = 120 / 60; // G° / (360° / hex sides)
hue = segment + shift;
break;
case b:
var segment = (r - g) / c;
var shift = 240 / 60; // B° / (360° / hex sides)
hue = segment + shift;
break;
}
}
return hue * 60; // hue is in [0,6], scale it up
}
关于colors - RGB 到 HSL 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39118528/
我拦截了一个数据包并提取了有效载荷。此有效负载是压缩的 jpeg 字节流数据(例如,将此数据分配给 unsigned char *payload )。我知道如果我有一个 FILE 指针,那么我可以使用
假设我们有一个单 channel 图像 (5x5) A = [ 1 2 3 4 5 6 7 8 9 2 1 4 5 6 3 4 5 6 7 4 3 4
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 2 年前。 Improve th
我有一个 RGB LED 并且有 9、10、11 的引脚和接地的引脚。已为 R、G 和 B 提供电阻器。 当我这样做时: analogWrite(r, 255); // I see a red c
我想知道如何从像素中获取颜色作为 RGB 整数,并在需要时进行转换。另外,如何利用差异来确定一个像素是否比另一个像素更亮或更暗。 最佳答案 简单: rgb_int = rgb_tuple[0] <<
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 3 年前。 Improve
我的目标是找到与数组中的 RGB 相比最接近的 RGB 匹配项。我已经创建了一个循环遍历图片中每个像素的函数。我现在唯一需要做的就是找到图片中每个像素最接近数组颜色的颜色。 $colors = arr
将 YUV 文件转换为 RGB 文件时出现问题。完成后,我无法使用 GIMP 或其他查看器打开 .rgb 文件,但我成功打开下载的 .rgb 文件。请告诉我RGB文件的结构是什么? (它是否包含标题?
我正在开发一个程序,在该程序中我获取图像的一部分并计算该图像的平均 RGB。当我计算它时,我得到完全不同的值,就好像我要使用内置函数一样。当我测试我的数字并将它们放入 RGB 颜色图表时,它们会关闭,
我正在尝试无损压缩图像,为了利用规律性,我想将图像从 RGB 转换为 Y'CbCr。 (我所说的 RGB 和 Y'CbCr 的具体细节在这里并不重要;RGB 数据由三个字节组成,我有三个字节来存储结果
我有一个应用程序可以生成一堆 jpg,我需要将这些 jpg 转换为 webm 视频。我正在尝试将 jpeg 中的 rgb 数据放入 vpxenc 示例中。我可以在输出视频中看到原始 jpg 的基本形状
我不太熟悉位移位,所以我有以下问题。我使用下面的函数(在别处找到)从 YUV 解码为 RGB int 数组。 现在我想调整红色或绿色或蓝色值来创建一些自定义滤镜效果。我需要检索 R 值、G 值和 B
在下面的代码片段中,我试图在 Visual C++ 中检索像素的 RGB 值,然后将相同的 RGB 值设置回相同的像素。也就是说,这只是一个测试。但是,当我这样做时,生成的图像相似但颜色错误/关闭。生
我试图在 上将 RGB 颜色从蓝色 (rgba(0,0,255)) 转换为红色 (rgba(255,0,0)) >JS mouseenter,渐进式。 因此,每次鼠标进入一个元素时,它都会“增加”其背
我需要根据像素的 RGB 颜色创建一个 Color 对象(读取 PNG 文件的 BufferedImage 对象,BufferedImage 颜色空间为 BufferedImage.TYPE_4BYT
我正在编写一段代码,它必须从 RGB 图像转换为 rgb 标准化空间。我已经使用 for 格式使用它,但它运行速度太慢,我需要评估大量图像。我正在尝试矢量化完整功能以加快它的速度。我现在有以下内容:
我想在多种光照条件下获取图像的 RGB 值。为了获得某种中性场景,我想使用一些预定义图像的 RGB 值对 RGB 值进行归一化。 让我解释一下。我有 6 张预定义图像,我知道它们的确切平均 RGB 值
将平行四边形((RGB)点的二维数组)投影到三角形((RGB)点的二维数组)(在我的特定情况下,将矩形投影到具有相同边长的直角三角形)的伪代码算法是什么(等腰),在我的例子中,斜边的大小与矩形的最大边
假设我有一张摄影底片扫描为 RGB 图像,我正试图找到一种算法将颜色值转换为 RGB 正片。 由于橙色偏差 (http://photo.net/learn/orange-negative-mask),
我已成功将图像转换为灰度图像,我想将灰度图像恢复为 RGB 图像。请帮忙。提前致谢。 -(UIImage *) toGrayscale { const int RED = 1;
我是一名优秀的程序员,十分优秀!