java - 将 RGBA、HSL 和 HSLA 颜色转换为 RGB(或在 java.awt.Color 对象中)

标签 java css rgb rgba hsl

我正在寻找用于将 RGBA、HSL 和 HSLA 颜色转换为 RGB 颜色的算法的描述,或者用于在 java.awt.Color 对象中转换它们的库。

你能帮帮我吗?

最佳答案

根据评论中的新信息,我将对此进行更改以反射(reflect)您拥有的与您需要的。

首先,我们需要解析 rgb/hsl 字符串。这可以使用几个正则表达式和 String.split 很容易地完成:

private static final Pattern hexRegex = Pattern.compile("#[\\dA-Fa-f]{6}");
private static final Pattern rgbRegex = Pattern.compile("rgba?\\([^)]*\\)", Pattern.CASE_INSENSITIVE);
private static final Pattern hlsRegex = Pattern.compile("hlsa?\\([^)]*\\)", Pattern.CASE_INSENSITIVE);

第一个 Pattern 匹配任何十六进制编码的值。第二个匹配 rgb(something)rgba(something)。第三个与第二个相同,但带有hslhsla。要使用这些:

public static int[] getRGB(String cssString) {
    if (hexRegex.matcher(cssString).matches())
        return getRgbFromHex(cssString);
    if (rgbRegex.matcher(cssString).matches())
        return getRgbFromRgb(cssString);
    if (hslRegex.matcher(cssString).matches())
        return getRgbFromHsl(cssString);
    return null; // no match
}

private static int[] getRgbFromHex(String hexString) {
    int rgb = Integer.decode(hexString);
    Color c = new Color(rgb);
    return new int[] { c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha() };
}

private static int[] getRgbFromRgb(String rgbString) {
    String[] values = rgbString.split("[\\s,()]");
    // values[0] is just "rgb" or "rgba"
    String red = values[1];
    String green = values[2];
    String blue = values[3];
    String alpha = "1.0";
    if (values.length >= 5) {
        alpha = values[4];
    }
    return new int[] {
        parseValue(red, 255),
        parseValue(green, 255),
        parseValue(blue, 255),
        parseAlpha(alpha),
    };
}

private static int[] getRgbFromHsl(String hslString) {
    String[] values = hslString.split("[\\s,()]");
    // values[0] is just "hsl" or "hsla"
    String hue = values[1];
    String sat = values[2];
    String light = values[3];
    String alpha = "1.0";
    if (values.length >= 5) {
        alpha = values[4];
    }
    int h = parseValue(hue, 360);
    double s = parsePercent(sat);
    double l = parsePercent(light);
    int a = parseAlpha(alpha);
    return hslToRgb(h, s, l, a);
}

private static int[] hslToRgb(int h, double s, double l, int a) {
    // TODO Calculate me
    int r = 0;
    int g = 0;
    int b = 0;
    return new int[] { r, g, b, a };
}

private static int parseValue(String val, int max) {
    if (val.endsWith("%")) {
        return (int) (parsePercent(val) * max);
    }
    return Integer.parseInt(val);
}

private static double parsePercent(String perc) {
    return Integer.parseInt(perc.substring(0, perc.length() - 1)) / 100.0;
}

private static int parseAlpha(String alpha) {
    return (int) (Double.parseDouble(alpha) * 255);
}

这是一切的作用:

  • getRGB - 获取 CSS 字符串,确定其格式,然后继续解析它。如果无法确定格式(即无效),则返回 null。返回的数组将包含 4 个元素,r、g、b 和 a,所有值都在 0 到 255 之间。
  • getRgbFromHex - 使用 Integer.decode 解析它,因为这为我们做了 # 十六进制数字,然后使用 Color 获取 RGB 值。
  • getRgbFromRgb - 解析来自 rgb 字符串(包括 rgba)的值。在空格、逗号或括号中拆分字符串,然后解析每个单独的值并从中创建一个数组。
  • getRgbFromHsl - 行为类似于 getRgbFromRgb,但使用 HSL 值和适当的解析而不是 RGB 解析。
  • hslToRgb - 这是您在评论中说过您已经完成的计算逻辑。只需根据 h、s 和 l 计算此处 r、g 和 b 的 int 值,此方法即可。
  • parseValue - 如果它是一个百分比,它返回​​解析的百分比乘以 max 的值,否则,它只是将它解析为一个 int 使用 Integer.parseInt
  • parsePercent - 解析字符串的整数部分并将值作为 double 除以 100 返回。
  • parseAlpha - 将 alpha 解析为 double 并将其返回 255 次。

用 rgb/rgba 测试确认这有效:

public static void main(String[] args) {
    System.out.println(Arrays.toString(getRGB("#FF00CC")));
    System.out.println(Arrays.toString(getRGB("rgb(255,0,0)")));
    System.out.println(Arrays.toString(getRGB("rgba(255,0,0,0.5)")));
    System.out.println(Arrays.toString(getRGB("rgba(100%,0%,30%,0.5)")));
}

这打印:

[255, 0, 204, 255]
[255, 0, 0, 255]
[255, 0, 0, 127]
[255, 0, 76, 127]

您可能需要考虑的另一件事是使用舍入而不是直接转换为 int 来处理百分比内容。这将提高百分比的准确性。

如果您还有其他问题,请告诉我。

关于java - 将 RGBA、HSL 和 HSLA 颜色转换为 RGB(或在 java.awt.Color 对象中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12373699/

相关文章:

java - 归并排序。错误--类型不匹配 : cannot convert from double to String

javascript - 四格列布局,一格固定(粘性)

c# - 算法:如何使用 RGB 值通过黄色从红色渐变为绿色?

ipad - 如何将 PDF 从 CMYK 转换为 RGB,以便在 iPad 上显示?

java - ImageButton 在点击时没有做任何事情 - android

java - 如何让 Spring 与 Wicket 兼容? (ContextLoaderListener 问题)

html - 如何用SVG+CSS绘制X符号?

javascript - 单击时所有菜单栏元素都获得相同的背景颜色

oracle - 如何在 PL/SQL 中创建 RGB 值?

java - @Query 不运行空条件