C#中颜色空间之间的转换算法

问题描述 投票:0回答:1

我需要所有流行的色彩空间,如 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};
}

并且这两个功能都可以正常工作

c# algorithm colors .net-6.0 color-space
1个回答
0
投票

我构建了一个名为 UnicolourC# 库,用于在许多不同的颜色空间之间进行转换,这可能是一个有用的起点。

但是,它当前支持的色彩空间基于光线,而不是油漆或印刷品。因此:

  • CMY/CMYK 尚未集成,但我正在研究使用 ICC 配置文件正确实现它的方法。在那之前,我已经提供了用于未校准的 CMY/CMYK 简单转换的示例代码
  • RYB 尚未实现,也不太可能实现,尽管我最终会使用 Kubelka-Munk 模型研究一般的“基于颜料”的混合

尽管如此,创建您自己的

RybToUnicolour
UnicolourToRyb
函数来填补需要的空白应该很容易。

© www.soinside.com 2019 - 2024. All rights reserved.