Не удалось преобразовать RGB<-> HSL, используя ЛЮБОЙ найденный алгоритм
Я не могу конвертировать цвет из HSL в RGB и наоборот. Я попробовал несколько способов (и, между прочим, начал с HSV <-> RGB) и закончил с этим одним преобразованием цвета HSL в RGB, моя реализация которого не работает для меня ни.
По сути, все, что я пробовал до сих пор, ломается в точке передачи вновь созданного массива в виде набора параметров новому объекту. Color(...)
, так как нет возможности передать array == {R,G,B}
прямо к Color(...)
Я делаю это незаметно... Я давно потерял терпение (неделя попытки-неудачи-попытки) и мне нужна реальная помощь!
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
Поэтому мне нужны реалистичные цифры.
1 ответ
Вы проходите n, 1, 1
на ваш hslToRGB
функция. Последняя 1 - это легкость, а легкость 1 (или 100%) всегда дает белый цвет, RGB(255, 255, 255). Это ваш вывод.
Вы можете найти калькулятор HSL онлайн, чтобы найти другие значения, чтобы проверить вашу реализацию.