📄 color.java
字号:
} /** * Converts from the HSB (hue, saturation, brightness) color model to the * RGB (red, green, blue) color model. The hue may be any floating point; * it's fractional portion is used to select the angle in the HSB model. * The saturation and brightness must be between 0 and 1. The result is * suitable for creating an RGB color with the one-argument constructor. * * @param hue the hue of the HSB value * @param saturation the saturation of the HSB value * @param brightness the brightness of the HSB value * @return the RGB value * @see #getRGB() * @see #Color(int) * @see ColorModel#getRGBdefault() */ public static int HSBtoRGB(float hue, float saturation, float brightness) { if (saturation == 0) return convert(brightness, brightness, brightness, 0); if (saturation < 0 || saturation > 1 || brightness < 0 || brightness > 1) throw new IllegalArgumentException(); hue = hue - (float) Math.floor(hue); int i = (int) (6 * hue); float f = 6 * hue - i; float p = brightness * (1 - saturation); float q = brightness * (1 - saturation * f); float t = brightness * (1 - saturation * (1 - f)); switch (i) { case 0: return convert(brightness, t, p, 0); case 1: return convert(q, brightness, p, 0); case 2: return convert(p, brightness, t, 0); case 3: return convert(p, q, brightness, 0); case 4: return convert(t, p, brightness, 0); case 5: return convert(brightness, p, q, 0); default: throw new InternalError("impossible"); } } /** * Converts from the RGB (red, green, blue) color model to the HSB (hue, * saturation, brightness) color model. If the array is null, a new one * is created, otherwise it is recycled. The results will be in the range * 0.0-1.0 if the inputs are in the range 0-255. * * @param red the red part of the RGB value * @param green the green part of the RGB value * @param blue the blue part of the RGB value * @param array an array for the result (at least 3 elements), or null * @return the array containing HSB value * @throws ArrayIndexOutOfBoundsException of array is too small * @see #getRGB() * @see #Color(int) * @see ColorModel#getRGBdefault() */ public static float[] RGBtoHSB(int red, int green, int blue, float array[]) { if (array == null) array = new float[3]; // Calculate brightness. int min; int max; if (red < green) { min = red; max = green; } else { min = green; max = red; } if (blue > max) max = blue; else if (blue < min) min = blue; array[2] = max / 255f; // Calculate saturation. if (max == 0) array[1] = 0; else array[1] = ((float) (max - min)) / ((float) max); // Calculate hue. if (array[1] == 0) array[0] = 0; else { float delta = (max - min) * 6; if (red == max) array[0] = (green - blue) / delta; else if (green == max) array[0] = 1f / 3 + (blue - red) / delta; else array[0] = 2f / 3 + (red - green) / delta; if (array[0] < 0) array[0]++; } return array; } /** * Returns a new instance of <code>Color</code> based on the specified * HSB values. The hue may be any floating point; it's fractional portion * is used to select the angle in the HSB model. The saturation and * brightness must be between 0 and 1. * * @param hue the hue of the HSB value * @param saturation the saturation of the HSB value * @param brightness the brightness of the HSB value * @return the new <code>Color</code> object */ public static Color getHSBColor(float hue, float saturation, float brightness) { return new Color(HSBtoRGB(hue, saturation, brightness), false); } /** * Returns a float array with the red, green, and blue components, and the * alpha value, in the default sRGB space, with values in the range 0.0-1.0. * If the array is null, a new one is created, otherwise it is recycled. * * @param array the array to put results into (at least 4 elements), or null * @return the RGB components and alpha value * @throws ArrayIndexOutOfBoundsException if array is too small */ public float[] getRGBComponents(float[] array) { if (array == null) array = new float[4]; getRGBColorComponents(array); // Stupid serialization issues require this check. array[3] = (falpha == 0 && frgbvalue == null ? ((getRGB() & ALPHA_MASK) >> 24) / 255f : falpha); return array; } /** * Returns a float array with the red, green, and blue components, in the * default sRGB space, with values in the range 0.0-1.0. If the array is * null, a new one is created, otherwise it is recycled. * * @param array the array to put results into (at least 3 elements), or null * @return the RGB components * @throws ArrayIndexOutOfBoundsException if array is too small */ public float[] getRGBColorComponents(float[] array) { if (array == null) array = new float[3]; else if (array == frgbvalue) return array; // Optimization for getColorComponents(float[]). if (frgbvalue == null) { // Do not inline getRGB() to this.value, because of SystemColor. int value = getRGB(); frgbvalue = new float[] { ((value & RED_MASK) >> 16) / 255f, ((value & GREEN_MASK) >> 8) / 255f, (value & BLUE_MASK) / 255f }; } array[0] = frgbvalue[0]; array[1] = frgbvalue[1]; array[2] = frgbvalue[2]; return array; } /** * Returns a float array containing the color and alpha components of this * color in the ColorSpace it was created with (the constructors which do * not take a ColorSpace parameter use a default sRGB ColorSpace). If the * array is null, a new one is created, otherwise it is recycled, and must * have at least one more position than components used in the color space. * * @param array the array to put results into, or null * @return the original color space components and alpha value * @throws ArrayIndexOutOfBoundsException if array is too small */ public float[] getComponents(float[] array) { int numComponents = cs == null ? 3 : cs.getNumComponents(); if (array == null) array = new float[1 + numComponents]; getColorComponents(array); // Stupid serialization issues require this check. array[numComponents] = (falpha == 0 && frgbvalue == null ? ((getRGB() & ALPHA_MASK) >> 24) / 255f : falpha); return array; } /** * Returns a float array containing the color components of this color in * the ColorSpace it was created with (the constructors which do not take * a ColorSpace parameter use a default sRGB ColorSpace). If the array is * null, a new one is created, otherwise it is recycled, and must have at * least as many positions as used in the color space. * * @param array the array to put results into, or null * @return the original color space components * @throws ArrayIndexOutOfBoundsException if array is too small */ public float[] getColorComponents(float[] array) { int numComponents = cs == null ? 3 : cs.getNumComponents(); if (array == null) array = new float[numComponents]; if (fvalue == null) // If fvalue is null, cs should be null too. fvalue = getRGBColorComponents(frgbvalue); System.arraycopy(fvalue, 0, array, 0, numComponents); return array; } /** * Returns a float array containing the color and alpha components of this * color in the given ColorSpace. If the array is null, a new one is * created, otherwise it is recycled, and must have at least one more * position than components used in the color space. * * @param space the color space to translate to * @param array the array to put results into, or null * @return the color space components and alpha value * @throws ArrayIndexOutOfBoundsException if array is too small * @throws NullPointerException if space is null */ public float[] getComponents(ColorSpace space, float[] array) { int numComponents = space.getNumComponents(); if (array == null) array = new float[1 + numComponents]; getColorComponents(space, array); // Stupid serialization issues require this check. array[numComponents] = (falpha == 0 && frgbvalue == null ? ((getRGB() & ALPHA_MASK) >> 24) / 255f : falpha); return array; } /** * Returns a float array containing the color components of this color in * the given ColorSpace. If the array is null, a new one is created, * otherwise it is recycled, and must have at least as many positions as * used in the color space. * * @param space the color space to translate to * @return the color space components * @throws ArrayIndexOutOfBoundsException if array is too small * @throws NullPointerException if space is null */ public float[] getColorComponents(ColorSpace space, float[] array) { float[] components = space.fromRGB(getRGBColorComponents(frgbvalue)); if (array == null) return components; System.arraycopy(components, 0, array, 0, components.length); return array; } /** * Returns the color space of this color. Except for the constructor which * takes a ColorSpace argument, this will be an implementation of * ColorSpace.CS_sRGB. * * @return the color space */ public ColorSpace getColorSpace() { return cs == null ? ColorSpace.getInstance(ColorSpace.CS_sRGB) : cs; } /** * Returns a paint context, used for filling areas of a raster scan with * this color. Since the color is constant across the entire rectangle, and * since it is always in sRGB space, this implementation returns the same * object, regardless of the parameters. Subclasses, however, may have a * mutable result. * * @param cm the requested color model * @param deviceBounds the bounding box in device coordinates, ignored * @param userBounds the bounding box in user coordinates, ignored * @param xform the bounds transformation, ignored * @param hints any rendering hints, ignored * @return a context for painting this solid color */ public PaintContext createContext(ColorModel cm, Rectangle deviceBounds, Rectangle2D userBounds, AffineTransform xform, RenderingHints hints) { if (context == null || !context.getColorModel().equals(cm)) context = new ColorPaintContext(cm,value); return context; } /** * Returns the transparency level of this color. * * @return one of {@link #OPAQUE}, {@link #BITMASK}, or {@link #TRANSLUCENT} */ public int getTransparency() { // Do not inline getRGB() to this.value, because of SystemColor. int alpha = getRGB() & ALPHA_MASK; return alpha == (255 << 24) ? OPAQUE : alpha == 0 ? BITMASK : TRANSLUCENT; } /** * Converts float values to integer value. * * @param red the red value * @param green the green value * @param blue the blue value * @param alpha the alpha value * @return the integer value made of 8-bit sections * @throws IllegalArgumentException if parameters are out of range 0.0-1.0 */ private static int convert(float red, float green, float blue, float alpha) { if (red < 0 || red > 1 || green < 0 || green > 1 || blue < 0 || blue > 1 || alpha < 0 || alpha > 1) throw new IllegalArgumentException("Bad RGB values"); int redval = Math.round(255 * red); int greenval = Math.round(255 * green); int blueval = Math.round(255 * blue); int alphaval = Math.round(255 * alpha); return (alphaval << 24) | (redval << 16) | (greenval << 8) | blueval; }} // class Color
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -