【问题标题】:How to generate different colors of same luminance for line chart in Java?如何在Java中为折线图生成不同颜色的相同亮度?
【发布时间】:2011-06-18 11:06:35
【问题描述】:

我想为我的折线图生成不同的颜色:

  • 我想生成同样不同的颜色(人眼)
  • 我希望它们具有相同的亮度(不是计算的亮度)

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

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

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

谢谢!

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

【问题讨论】:

  • 您考虑过实验室色彩空间吗?
  • 是的,它看起来很有希望。但我必须在这上面多花点时间。我正在寻找解决方案,所以我不必在这个主题上花费更多时间。
  • 请记住,您正在为色盲人士制造可用性噩梦,他们主要使用亮度来区分图表中的红绿色阴影等。
  • 我会记住这一点的,谢谢。

标签: java google-app-engine colors color-scheme color-space


【解决方案1】:

这是我刚才在查看维基百科页面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。

示例图片:

我对谷歌应用引擎一无所知,但 ARGB 整数是您需要的那种颜色规范吗?

【讨论】:

  • 我将您的代码重写为 Mirah(使用 ruby​​ 语法的 java),结果总是得到 'ff808080',无论我传入什么。我不得不用 Long.parseLong(" FF808080", 16)
  • 所以我设法让它输出一些颜色(你对那个 0.3..0.5 的空间是正确的)但它们并没有太大的不同(它们都是黄色的)。您可以发布一个示例用法来输出 N 种颜色的调色板吗?谢谢!
  • 嗯,不容易生成N种颜色,因为色域的边缘是梯形的(见更新代码)。我还有 2 条建议:要么使用标准 J2SE(或其他任何东西)预先计算 RGB 颜色数组,我会使用 HSL,但你不适合,不知道为什么。或者,计算 RGB 空间中的许多颜色并将它们放入一个集合中,按亮度排序并从集合中取出一个大小为 N 的切片(如果需要,我可以发布代码)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 2022-10-05
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
  • 1970-01-01
  • 2018-11-30
相关资源
最近更新 更多