我需要所有流行的色彩空间,如 RYB、RGB、RGBA、HSL、HSV、CMY 和 CMYK。 我决定建立一个基本的 RYB 系统,我必须将其翻译给其他人。我已经成功创建了一个算法来做到这一点:
public static int[] ryb2rgb(int[] cveta)
{
double w; double r; double y; double b; double g; double myc; double mgc;
w = Math.Min(Math.Min(cveta[0], cveta[1]), cveta[2]);
r = (double)(cveta[0]) - w;
y = (double)(cveta[1]) - w;
b = (double)(cveta[2]) - w;
myc = Math.Max(Math.Max(r, y), b);
g = Math.Min(y, b);
y -= g; b -= g;
b *= 2.0; g *= 2.0;
r += y; g += y;
mgc = Math.Max(Math.Max(r, g), b);
if (mgc != 0)
{
r *= (myc / mgc);
g *= (myc / mgc);
b *= (myc / mgc);
}
r += w; g += w; b += w;
return new int[3] {(int)r, (int)g, (int)b};
}
我有一个类似的函数,但作用相反。
有人可以提供算法或者说从哪里得到它吗?注意 十六进制不是一个选项,内置方法也不是一个选项。最好从 RYB 到其他颜色空间(RGB 我已经完成了)。如果没有,我可以通过调用
ryb2rgb
并将 that
转换为不同的颜色来获取 RGB。谢谢!
这是相反的转换:RGB 到 RYB。
public static int[] rgb2ryb(int[] cveta)
{
double w; double r; double g; double b; double y; double mgc; double myc;
w = Math.Min(Math.Min(cveta[0], cveta[1]), cveta[2]);
r = (double)(cveta[0]) - w;
g = (double)(cveta[1]) - w;
b = (double)(cveta[2]) - w;
mgc = Math.Max(Math.Max(r, g), b);
y = Math.Min(r, g);
r -= y; g -= y;
b /= 2.0; g /= 2.0;
y += g; b += g;
myc = Math.Max(Math.Max(r, g), b);
if (myc != 0)
{
r *= (mgc / myc);
y *= (mgc / myc);
b *= (mgc / myc);
}
r += w; y += w; b += w;
return new int[3] {(int)r, (int)y, (int)b};
}
并且这两个功能都可以正常工作
我构建了一个名为 Unicolour 的 C# 库,用于在许多不同的颜色空间之间进行转换,这可能是一个有用的起点。
但是,它当前支持的色彩空间基于光线,而不是油漆或印刷品。因此:
尽管如此,创建您自己的
RybToUnicolour
和 UnicolourToRyb
函数来填补需要的空白应该很容易。