Не удалось преобразовать RGB <-> HSL, используя ЛЮБОЙ найденный алгоритм - PullRequest
0 голосов
/ 30 мая 2019

Я не могу конвертировать цвет из 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

Так что мне нужны реалистичные числа там.

1 Ответ

0 голосов
/ 30 мая 2019

Вы передаете n, 1, 1 вашей функции hslToRGB. Последняя 1 - это легкость, а легкость 1 (или 100%) всегда дает белый цвет, RGB (255, 255, 255). Это ваш вывод.

Вы можете найти калькулятор HSL в Интернете, чтобы найти другие значения для проверки вашей реализации.

...