生成光谱色彩调色板

14

有没有一种简单的方法在Java中转换颜色模型(RGB、HSV和Lab)。

假设采用RGB颜色模型:

  • 如何计算黑体光谱颜色调色板?我想用它来制作热力图。
  • 单波长光谱怎么样?

编辑: 我发现ColorSpace类可以用于RGB / CIE和许多其他颜色模型之间的转换。


谢谢,所有的答案都很好。我选择了那个反映了我实际使用的方法(渐变黑-红-黄-白)。 - ddimitrov
以下是我相关的一些值得查看的QA:可见光谱的RGB值星等B-V颜色指数到表观RGB颜色 - Spektre
5个回答

24

Java内置了RGB到HSB的转换功能。每当我需要在Java中快速生成一个颜色调色板时,我只需这样做:

public Color[] generateColors(int n)
{
    Color[] cols = new Color[n];
    for(int i = 0; i < n; i++)
    {
        cols[i] = Color.getHSBColor((float) i / (float) n, 0.85f, 1.0f);
    }
    return cols;
}

这是一个快速而简单的hack(我会为您的应用程序调整“神奇”的数字),但对于我简单的使用,它生成了一个美丽、明亮、愉悦的调色板。


4
两年后,这也对我有所帮助。谢谢。 - Amy B

4
也许我没有理解你的问题,但是你无法从RGB输出设备中生成真正的黑体光谱。受限的色彩范围可能是一个问题,如果没有其他问题。如果你只想得到外观类似于黑体光谱的东西,那可能会更容易一些。
作为一种近似方法,从(R,G,B)(0,0,0)到(255,0,0),然后到(255,255,0),再到(255,255,255)进行渐变。这会给你一个暗红色到橙色、黄色到白色的过渡。
如果你想要更科学的东西,《维基百科》上关于black body radiation的文章有一些颜色与温度的图表。一旦你确定了CIE坐标,你可以将它们转换成你喜欢的颜色空间中的RGB。
编辑:找到了一些其他的在线参考资料: What color is the Sun? What color is a blackbody?

抱歉,我指的是在监视器的颜色空间中对BBS的投影(使用于热力图中的那种渐变)。这些链接很有意思。 - ddimitrov

3
你可以使用HSV颜色模型创建这样的调色板。一旦你有了HSV转RGB代码并且花费几分钟调整数字,这就很容易了。
然而,我认为为了生成一个小的调色板而将代码添加到你的项目中是不值得的。
从文件中提取所需的调色板并将其添加为静态数组要容易得多,也更省事。
Photoshop允许你编辑调色板,并预设了一个非常好看的黑体调色板。
你可以将它们简单地保存为.act文件。该文件本身只是一个简单的256色 á 3字节文件(顺序为红、绿、蓝。每个通道8位)。

0

您可以使用以下代码生成此颜色谱 https://istack.dev59.com/ktLmt.webp

public void render(Screen screen) {
    int green = 255;
    int red = 0;

    for (int i = 0; i <= 255 * 2; i++) {
        int rate = i / 255;

        screen.fillRect((x + (i * width)/6), y, width, height, new Color(red, green, 0));

        red += 1 - rate;
        green -= rate;
    }   
}

-1

这是在AS3中制作HSL颜色方块的好方法。

/**
 * Generate a BitmapData HSL color square (n x n) of hue
 * At a low n dimension you get cool blocky color palettes (e.g. try n=10)
 */
function generateColorSquare(n:uint, hue:uint):BitmapData
            {
                var bd:BitmapData = new BitmapData(n, n, false, 0xFFFFFF);
                for (var i:uint=n*n; i > 0; i--)
                {
                    bd.setPixel(i % n, Math.floor(i / n),  HSBColor.convertHSBtoRGB(hue, i / (n*n), (1/n) * (i % n) ));
                }
                return bd;
            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接