Как создать разные цвета одинаковой яркости для линейного графика в Java? - PullRequest
7 голосов
/ 31 января 2011

Я хочу создать разные цвета для моих линейных графиков:

  • Я хочу создать одинаково разные цвета (для человеческого глаза)
  • Я хочу, чтобы они имели одинаковую яркость (не вычисленную яркость)

(исключаются RGB и HSL, YIQ близок, но имеет не совсем равномерную яркость)

Использовали ли вы какие-либо библиотеки (на Java) для создания единой цветовой схемы?

Я уже потратил несколько дней на эту проблему, поэтому надеюсь, что некоторые из вас столкнулись с той же проблемой и решили ее.

Спасибо!

Редактировать : к сожалению, я не могу использовать пакеты java.awt в AppEngine (или что-либо, что использует java.awt.Color).

1 Ответ

2 голосов
/ 31 января 2011

Вот небольшая функция, которую я только что написал, просматривая страницу Википедии 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, но это целое число ARGBкакая цветовая спецификация вам нужна?

...