Java examples for 2D Graphics:Color RGB
Returns the HSL (Hue/Saturation/Luminance) equivalent of a given RGB color.
/*//from w w w .java 2 s . co m * This is a fork of GHEAT_JAVA https://github.com/varunpant/GHEAT-JAVA * <p> * The MIT License * <p> * Copyright (c) 2014 Varun Pant * <p> * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in * the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: * <p> * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. * <p> * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * <p> */ //package com.java2s; import java.awt.*; public class Main { /** * <p>Returns the HSL (Hue/Saturation/Luminance) equivalent of a given * RGB color. All three HSL components are between 0.0 and 1.0.</p> * * @param color the RGB color to convert * @return a new array of 3 floats corresponding to the HSL components */ public static float[] RGBtoHSL(Color color) { return RGBtoHSL(color.getRed(), color.getGreen(), color.getBlue(), null); } /** * <p>Returns the HSL (Hue/Saturation/Luminance) equivalent of a given * RGB color. All three HSL components are between 0.0 and 1.0.</p> * * @param color the RGB color to convert * @param hsl a pre-allocated array of floats; can be null * @return <code>hsl</code> if non-null, a new array of 3 floats otherwise * @throws IllegalArgumentException if <code>hsl</code> has a length lower * than 3 */ public static float[] RGBtoHSL(Color color, float[] hsl) { return RGBtoHSL(color.getRed(), color.getGreen(), color.getBlue(), hsl); } /** * <p>Returns the HSL (Hue/Saturation/Luminance) equivalent of a given * RGB color. All three HSL components are between 0.0 and 1.0.</p> * * @param r the red component, between 0 and 255 * @param g the green component, between 0 and 255 * @param b the blue component, between 0 and 255 * @return a new array of 3 floats corresponding to the HSL components */ public static float[] RGBtoHSL(int r, int g, int b) { return RGBtoHSL(r, g, b, null); } /** * <p>Returns the HSL (Hue/Saturation/Luminance) equivalent of a given * RGB color. All three HSL components are floats between 0.0 and 1.0.</p> * * @param r the red component, between 0 and 255 * @param g the green component, between 0 and 255 * @param b the blue component, between 0 and 255 * @param hsl a pre-allocated array of floats; can be null * @return <code>hsl</code> if non-null, a new array of 3 floats otherwise * @throws IllegalArgumentException if <code>hsl</code> has a length lower * than 3 */ public static float[] RGBtoHSL(int r, int g, int b, float[] hsl) { if (hsl == null) { hsl = new float[3]; } else if (hsl.length < 3) { throw new IllegalArgumentException( "hsl array must have a length of" + " at least 3"); } if (r < 0) r = 0; else if (r > 255) r = 255; if (g < 0) g = 0; else if (g > 255) g = 255; if (b < 0) b = 0; else if (b > 255) b = 255; float var_R = (r / 255f); float var_G = (g / 255f); float var_B = (b / 255f); float var_Min; float var_Max; float del_Max; if (var_R > var_G) { var_Min = var_G; var_Max = var_R; } else { var_Min = var_R; var_Max = var_G; } if (var_B > var_Max) { var_Max = var_B; } if (var_B < var_Min) { var_Min = var_B; } del_Max = var_Max - var_Min; float H, S, L; L = (var_Max + var_Min) / 2f; if (del_Max - 0.01f <= 0.0f) { H = 0; S = 0; } else { if (L < 0.5f) { S = del_Max / (var_Max + var_Min); } else { S = del_Max / (2 - var_Max - var_Min); } float del_R = (((var_Max - var_R) / 6f) + (del_Max / 2f)) / del_Max; float del_G = (((var_Max - var_G) / 6f) + (del_Max / 2f)) / del_Max; float del_B = (((var_Max - var_B) / 6f) + (del_Max / 2f)) / del_Max; if (var_R == var_Max) { H = del_B - del_G; } else if (var_G == var_Max) { H = (1 / 3f) + del_R - del_B; } else { H = (2 / 3f) + del_G - del_R; } if (H < 0) { H += 1; } if (H > 1) { H -= 1; } } hsl[0] = H; hsl[1] = S; hsl[2] = L; return hsl; } }