如何在Java中为线图生成相同亮度的不同颜色?

7
我想为我的线图生成不同的颜色:
  • 我想生成颜色相互区分(对人眼可见)
  • 它们的亮度应该相同(不是计算的亮度)

(这排除了RGB和HSL,YIQ接近但没有完全均匀的亮度)

您是否使用过任何库(在Java中)来处理统一的颜色方案生成?

我已经花了几天时间研究这个问题,所以我希望你们中的一些人也有同样的问题并解决了它。

谢谢!

编辑:不幸的是,我不能在AppEngine上使用java.awt包(或任何使用java.awt.Color的东西)。


你有考虑过 LAB 颜色空间吗? - Rekin
是的,看起来很有希望。但我需要再花些时间研究一下。我正在寻找一个解决方案,这样我就不必在这个问题上再花费更多天的时间了。 - hakunin
1
请记住,您正在为色盲人创造可用性噩梦,他们主要使用亮度来区分图表等中的红绿色调。 - ddimitrov
1个回答

2

我刚刚从查看维基百科页面http://en.wikipedia.org/wiki/SRGB_color_space,写了一个简单的函数。

private int makeARGB(double Y, double x, double y) {
  // Out of gamut colour
  int rgb = 0xFF808080;
  double X = Y * x / y;
  double Z = Y * (1 - x - y) / y;
  double rlin = +3.2046 * X + -1.5372 * Y + -0.4986 * Z;
  double r = gamma(rlin);
  int ir = (int) (r * 255.0);
  if (ir >= 0 && ir < 256) {
    double glin = -0.9689 * X + +1.8758 * Y + +0.0415 * Z;
    double g = gamma(glin);
    int ig = (int) (g * 255.0);
    if (ig >= 0 && ig < 256) {
      double blin = +0.0557 * X + -0.2040 * Y + +1.0570 * Z;
      double b = gamma(blin);
      int ib = (int) (b * 255.0);
      if (ib >= 0 && ib < 256) {
        rgb = 0xFF000000 + (ir << 16) + (ig << 8) + (ib << 0);
      }
    }
  }
  return rgb;
}
private double gamma(double l) {
  if (l < 0.0031308) {
    return l * 12.92;
  } else {
    return 1.055 * Math.pow(l, 1.0 / 2.4) - 0.055;
  }
}
private BufferedImage createImage() {
    BufferedImage bm = new BufferedImage(256, 256, BufferedImage.TYPE_INT_ARGB);
    for (int ix = 0; ix < bm.getWidth(); ++ix) {
        double astar = ((double) ix) / ((double) bm.getWidth());
        for (int iy = 1; iy < bm.getHeight(); ++iy) {
            double bstar = ((double) iy) / ((double) bm.getHeight());
            int rgb = makeARGB(0.3, astar, bstar);
            bm.setRGB(ix, iy, rgb);
        }

    }
    return bm;
}

您需要传入亮度Y和颜色坐标x,y。x和y通常从0到1,但是很多“空间”不在sRGB色域内,因此不对应可显示的颜色。 Y也是0到1,最初尝试0.3到0.5。
示例图像:gamut with Y=0.3 我不了解Google App Engine,但ARGB整数是您需要的颜色规范吗?

我将你的代码改写成了Mirah(具有Ruby语法的Java),无论我传入什么,结果总是'ff808080'。我不得不用Long.parseLong("FF808080", 16)替换"0xFF808080" <- 这可能是问题的原因吗? - hakunin
所以我设法让它输出一些颜色(你在0.3..0.5空间上是正确的),但它们并不是非常不同(它们都是黄色的)。你能发布一个使用示例来输出N种颜色的调色板吗?谢谢! - hakunin
嗯,生成N种颜色并不容易,因为色域的边缘是一个梯形(请参见更新的代码)。我有两个建议:要么使用标准的J2SE(或其他任何东西)预先计算RGB颜色数组,我会使用HSL,但您似乎认为那不合适,不确定为什么。要么,在RGB空间中计算大量颜色并将它们放入集合中,按亮度排序并从集合中取出大小为N的切片(如果需要,我可以发布此代码)。 - Peter Hull

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