java - HSL 到 RGB 转换器不工作

标签 java colors

我在空闲时间一直在制作一个图像编辑器,并尝试在这里使用 HSL 到 RGB 转换公式:HSL to RGB color conversion但是我遇到了一个错误。

每当我运行程序时,转换都无法正常工作,使 RGB 呈现出意想不到的灰色。以下是一些示例输出数据:

HSL: 0.0, 0.0, 1.0
RGB: 255.0, 255.0, 255.0
HSL: 214.0, 0.73, 0.5
RGB: 128.0, 128.0, 128.0
HSL: 214.0, 0.74, 0.5
RGB: 128.0, 128.0, 128.0
HSL: 214.0, 0.75, 0.5
RGB: 128.0, 128.0, 128.0
HSL: 214.0, 0.76, 0.5
RGB: 128.0, 128.0, 128.0
HSL: 214.0, 0.76, 0.5
RGB: 128.0, 128.0, 128.0

下面是我的代码。全部都是用 Java 编写的。

public double[] hslToRgb(double h, double s, double l){

    System.out.println("HSL: " + h + ", " + s + ", " + l);

    double r = -1;
    double b = -1;
    double g = -1;

    if(s == 0){

        r = l;
        b = l;
        g = l;

    }else{

        double q = 1 < 0.5 ? l * (1 + s) : l + s - 1 * s;
        double p = 2 * l - q;

        r = hueToRgb(p, q, h + (1 / 3));
        g = hueToRgb(p, q, h);
        b = hueToRgb(p, q, h - (1/ 3));
    }

    r = Math.round(r * 255);
    b = Math.round(b * 255);
    g = Math.round(g * 255);

    System.out.println("RGB: " + r + ", " + g + ", " + b);
    double[] rgb = {r, g, b};

    return rgb;
}

private double hueToRgb(double p, double q, double t){

    if(t < 0){

        t++;
    }

    if(t > 1){

        t--;
    }

    if(t < 1 / 6){

        return p + (q - p) * 6 * t;
    }

    if(t < 1 / 2){

        return q;
    }

    if(t < 2 / 3){

        return p + (q - p) * ((2 / 3) - t) * 6;
    }

    return p;
}

有人能给我一些关于可能导致这种情况的原因的见解吗?我觉得这是我的代码中的一个小错误,但我在任何地方都找不到它。

最佳答案

首先,在 double q = 1 < 0.5 ... 行中,它应该是字母 EL l ,不是数字 1在两个地方。

double q = 1 < 0.5 ? l * (1 + s) : l + s - 1 * s;
           ^ ----- change from 1 to l ---- ^

其次,您必须非常小心算术,它在 Java 中的工作方式与 JavaScript 不同。当你有像 1 / 3 这样的代码时,由于两者都是整数,因此结果将是一个整数,这意味着您得到 0而不是0.3333... 。为了防止使用整数除法,所有除法都需要使用至少一种浮点类型:

if(t < 1.0 / 6){
       ^^^ change from 1 to 1.0
    return p + (q - p) * 6 * t;
}

if(t < 1.0 / 2){
       ^^^ change from 1 to 1.0
    return q;
}

if(t < 2.0 / 3){
       ^^^ change from 2 to 2.0
    return p + (q - p) * ((2.0 / 3) - t) * 6;
                           ^^^ change from 2 to 2.0
}

另外:

    r = hueToRgb(p, q, h + (1.0 / 3));
                            ^^^ change from 1 to 1.0
    g = hueToRgb(p, q, h);
    b = hueToRgb(p, q, h - (1.0 / 3));
                            ^^^ change from 1 to 1.0

最后,在您复制的代码中,h、s 和 l 的值均应介于 0 和 1 之间。因此,214 的 H 在您的示例中无效 - 您需要将其除以 360首先。

以下是应用了更改的工作代码示例:http://ideone.com/QbXyYi

Input: 240.0 / 360.0, 1.0, 0.5

Output: [0, 0, 255.0]

关于java - HSL 到 RGB 转换器不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31955698/

相关文章:

android - 位图变大要用getPixels?

java - 使用 "*.isInstance"的正确方向是什么?

java - setFrameIcon 的动态 ImageIcon 缩减

java - 如何扩展testNG?

python - 如何将 CNN 的输出剪辑为特定的颜色列表

cocoa NSBezierPath - 中风。颜色与预定义颜色不同的崩溃

php - 如何按降序创建颜色函数

java - 什么会使单个任务执行器停止处理任务?

java - 初始化 java 类中所有对象的简单方法

google-maps-api-3 - KML ARGB 颜色显示不正确