Пример #1
0
  static Rgb hisToRgb(double h, double i, double s) {
    double m1, m2, i1;

    m1 = s * Math.sin(h * Math.PI / 180);
    m2 = s * Math.cos(h * Math.PI / 180);
    i1 = i / Math.sqrt(3);

    Rgb rgb = new Rgb();

    rgb.r = m1 * 2 / Math.sqrt(6) + i1 / Math.sqrt(3);
    rgb.g = -m1 / Math.sqrt(6) + m2 / Math.sqrt(2) + i1 / Math.sqrt(3);
    rgb.b = -m1 / Math.sqrt(6) - m2 / Math.sqrt(2) + i1 / Math.sqrt(3);

    rgb.r = rgb.r / 2 + 0.5;
    rgb.g = rgb.g / 2 + 0.5;
    rgb.b = rgb.b / 2 + 0.5;
    if (rgb.r > 1) rgb.r = 1;
    if (rgb.r < 0) rgb.r = 0;
    if (rgb.g > 1) rgb.g = 1;
    if (rgb.g < 0) rgb.g = 0;
    if (rgb.b > 1) rgb.b = 1;
    if (rgb.b < 0) rgb.b = 0;

    return rgb;
  }
  @Override
  public void fromRgb(final Rgb srcColor, final ColorSpace3D dstColor) {

    double arithmeticR = srcColor.getFirstChannel() / MAX_RGB;
    double arithmeticG = srcColor.getSecondChannel() / MAX_RGB;
    double arithmeticB = srcColor.getThirdChannel() / MAX_RGB;

    double max = Math.max(arithmeticR, Math.max(arithmeticG, arithmeticB));
    double min = Math.min(arithmeticR, Math.min(arithmeticG, arithmeticB));
    double delta = max - min;

    double h = 0;
    if (delta >= EPS) {
      if (max == arithmeticR) {
        h = DEGREES * ((arithmeticG - arithmeticB) / delta % R_DIVIDER);
      } else if (max == arithmeticG) {
        h = DEGREES * ((arithmeticB - arithmeticR) / delta + G_OFFSET);
      } else if (max == arithmeticB) {
        h = DEGREES * ((arithmeticR - arithmeticG) / delta + B_OFFSET);
      }
    }

    double s = max <= 0 ? 0 : 1 - min / max;
    double v = max;

    dstColor.setChannels(h, s, v);
  }
Пример #3
0
  /**
   * This method return the distance between two RGB points
   *
   * @param c1 : RGB point one
   * @param c2 : RGB point two
   * @return Integer with distance
   */
  public int getDistance(Rgb c1, Rgb c2) {
    int dRed = c1.getRed() - c2.getRed();
    int dBlue = c1.getBlue() - c2.getBlue();
    int dGreen = c1.getGreen() - c2.getGreen();

    return ((dRed * dRed) + (dBlue * dBlue) + (dGreen * dGreen));
  }
Пример #4
0
  /**
   * This method convert an RGB point to its respective CMYK
   *
   * @param rgbColor: RGB point
   * @return CMYK object
   */
  public Cmyk rgbToCmyk(Rgb rgbColor) {
    Cmyk cmykColor = null;
    int black =
        Math.min(
            Math.min(255 - rgbColor.getRed(), 255 - rgbColor.getGreen()), 255 - rgbColor.getBlue());

    if (black == 255) {
      cmykColor =
          new Cmyk(
              255 - rgbColor.getRed(), 255 - rgbColor.getGreen(), 255 - rgbColor.getBlue(), black);
    } else {
      cmykColor =
          new Cmyk(
              (int) ((255 - rgbColor.getRed() - black) / (255 - black)),
              (int) ((255 - rgbColor.getGreen() - black) / (255 - black)),
              (int) ((255 - rgbColor.getBlue() - black) / (255 - black)),
              black);
    }

    return (cmykColor);
  }
Пример #5
0
  public static Color rgbColor(int idx) {
    double gray_i0 = 0.32;
    double gray_i1 = 0.95;

    double h1, i1, s1;
    double r, g, b;
    int i, j, k;
    Rgb rgb;
    Color color = null;

    if (idx == 300)
      // TODO, should be background color
      idx = 31;

    if (idx < 4)
      color =
          new Color(
              (int) (colorValues[3 * idx] * 255),
              (int) (colorValues[3 * idx + 1] * 255),
              (int) (colorValues[3 * idx + 2] * 255));
    else if (idx < 20) {
      h1 = 360. * (idx - 4) / 16;
      s1 = 1.5;
      i1 = 1;
      rgb = hisToRgb(h1, i1, s1);
      color = new Color((int) (rgb.r * 255), (int) (rgb.g * 255), (int) (rgb.b * 255));
    } else if (idx < 60) {
      int val;
      if (idx < 30 || (50 <= idx && idx < 60)) gray_i0 = 0.25F;

      val =
          (int)
              ((gray_i0 + (gray_i1 - gray_i0) * Math.pow((double) (9 - idx % 10) / 9, 0.9)) * 255);
      color = new Color(val, val, val);
    } else if (idx < 300) {
      double i_min, i_max, s, a, h, hk;

      i = (idx - 60) / 30;
      j = (idx - 60 - i * 30) / 10;
      k = 9 - (idx - 60 - i * 30 - j * 10);

      h = ctab[i * 14];
      hk = ctab[i * 14 + 1];
      s = ctab[i * 14 + 2 + j * 4];
      i_min = ctab[i * 14 + 2 + j * 4 + 1];
      i_max = ctab[i * 14 + 2 + j * 4 + 2];
      a = ctab[i * 14 + 2 + j * 4 + 3];

      s1 = s;
      i1 = i_min + (i_max - i_min) * Math.pow((double) k / 9, a);
      h1 = h + hk * k / 9;

      if ((i == 0 && j == 2) || (i == 2 && j == 2 && k > 5)) {
        // Formula doesn't work for yellow...
        rgb = new Rgb();
        rgb.r = rgbTab[(i * 10 + k) * 3];
        rgb.g = rgbTab[(i * 10 + k) * 3 + 1];
        rgb.b = rgbTab[(i * 10 + k) * 3 + 2];
      } else rgb = hisToRgb(h1, i1, s1);

      color = new Color((int) (rgb.r * 255), (int) (rgb.g * 255), (int) (rgb.b * 255));
    }
    return color;
  }