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); }
/** * 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)); }
/** * 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); }
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; }