Я не могу конвертировать цвет из HSL в RGB и наоборот.Я пробовал несколько способов (и, между прочим, начал с HSV <-> RGB) и закончил этим преобразованием цвета HSL в RGB , моя реализация которого не работает для меня.
По сути, все, что я до сих пор пробовал, прерывается в точке передачи вновь созданного массива в виде набора параметров новому объекту Color(...)
, поскольку нет возможности передать array == {R,G,B}
непосредственно в Color(...)
Я делаю это незаметно ... Я давно исчерпал свое терпение (неделя try-fail-try_again) и мне нужна реальная помощь!
package types;
import java.awt.*;
import java.util.ArrayList;
public final class ColorsArrayFinal {
private final ArrayList<Color> array = new ArrayList<>(0);
public ArrayList<Color> getArray() {
return array;
}
public static void main(String[] args) {
new ColorsArrayFinal(5);
}
public ColorsArrayFinal(int totalNumberOfColors) {
int higherBorder, lowerBorder;
higherBorder = ColorsArray.getGreenBoundNum();
lowerBorder = ColorsArray.getRedBoundNum();
float step = (float) (higherBorder - lowerBorder) / totalNumberOfColors;
int[] temp = hslToRgb(0.13f, 1.f, 1.f);
System.out.println(new Color(temp[0], temp[1], temp[2]));//This does not work already
System.out.println(new Color(123, 213, 13));//And this does work (What a surprise...)
int i = 0;
for (float n = lowerBorder; n < higherBorder; n += step) {
temp = hslToRgb(n, 1f, 1f);
array.add(new Color(temp[0], temp[1], temp[2]));
System.out.println(i+1 + " " + array.get(i).toString());
i++;
} //This does not work, of course
}
/**
* HSL to RGB
* <p>
* Converts an HSL color value to RGB. Conversion formula
* adapted from http://en.wikipedia.org/wiki/HSL_color_space.
* Assumes h, s, and l are contained in the set [0, 1] and
* returns r, g, and b in the set [0, 255].
*
* @param h The hue
* @param s The saturation
* @param l The lightness
* @return int array, the RGB representation
*/
private int[] hslToRgb(float h, float s, float l) {
float r, g, b;
if (s == 0f) {
r = g = b = l; // achromatic
} else {
float q = l < 0.5f ? l * (1 + s) : l + s - l * s;
float p = 2 * l - q;
r = hueToRgb(p, q, h + 1f / 3f);
g = hueToRgb(p, q, h);
b = hueToRgb(p, q, h - 1f / 3f);
}
return new int[]{to255(r), to255(g), to255(b)};
}
private int to255(float v) {
return (int) Math.min(255, 256 * v);
}
/**
* Helper method that converts hue to rgb
*/
private float hueToRgb(float p, float q, float t) {
if (t < 0f)
t += 1f;
if (t > 1f)
t -= 1f;
if (t < 1f / 6f)
return p + (q - p) * 6f * t;
if (t < 1f / 2f)
return q;
if (t < 2f / 3f)
return p + (q - p) * (2f / 3f - t) * 6f;
return p;
}
}
Я понятия не имею, как должен выглядеть вывод, новот что я получаю сейчас:
java.awt.Color[r=255,g=255,b=255]
java.awt.Color[r=123,g=213,b=13]
1 java.awt.Color[r=255,g=255,b=255]
2 java.awt.Color[r=255,g=255,b=255]
3 java.awt.Color[r=255,g=255,b=255]
4 java.awt.Color[r=255,g=255,b=255]
5 java.awt.Color[r=255,g=255,b=255]
Process finished with exit code 0
Так что мне нужны реалистичные числа там.