14

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

假设 RGB 颜色模型:

  • 如何计算黑体光谱调色板?我想将它用于热图图表。
  • 单波长光谱怎么样?

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

4

5 回答 5

23

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(我会为您的应用程序调整“神奇”数字),但对于我的简单用途,它会生成一个漂亮明亮宜人的托盘。

于 2008-10-22T02:31:28.810 回答
4

也许我不理解您的问题,但您无法真正从 RGB 输出设备生成真正的黑体光谱。如果没有别的,有限的色域将是一个问题。如果你想要的只是视觉上类似于黑体光谱的东西,那可能会容易得多。

作为近似值,从 (R,G,B) (0,0,0) 到 (255,0,0),然后到 (255,255,0),然后到 (255,255,255)。这会给你从暗红色到橙色,到黄色,到白色的过渡。

如果你想要更科学的东西,维基百科关于黑体辐射的文章有一些颜色与温度的关系图。一旦你计算出 CIE 坐标,你就可以在你最喜欢的色彩空间中将它们转换为 RGB。

编辑:找到其他一些在线参考资料: 太阳是什么颜色? 黑体是什么颜色的?

于 2008-10-22T00:50:27.097 回答
3

您可以使用 HSV 颜色模型构建这样的调色板。一旦您准备好 HSV 到 RGB 代码并使用这些数字玩几分钟,这很容易。

但是,我认为将代码添加到您的项目中只是为了生成一个小调色板是不值得的。

从文件中提取所需的调色板并将它们添加为静态数组更容易且工作量更少。

Photoshop 让您编辑调色板,并附带一个非常漂亮的黑色主体调色板作为预设。

您可以简单地将这些保存为 .act 文件。该文件本身只是一个简单的 256 色 á 3 字节文件(顺序为读取,绿色,蓝色。每个通道 8 位)。

于 2008-10-21T23:52:16.730 回答
0

您可以生成此色谱https://i.stack.imgur.com/ktLmt.jpg

使用以下代码:

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;
    }   
}
于 2017-10-24T18:25:14.933 回答
-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;
            }
于 2010-04-08T06:59:09.800 回答