Java中的颜色检测器

时间:2012-02-22 12:05:44

标签: java colors

我有十六进制格式的颜色列表(例如#000000),我想检测颜色类型(蓝色,红色,绿色等),然后将颜色类型更改为另一种颜色类型。这是可能的,是否有任何框架/库用于此任务?

示例:

我有颜色#EB1369(红色)然后我将其转换为蓝色,它变为例如#1313EB(蓝色)。

4 个答案:

答案 0 :(得分:1)

尝试将RGB值转换为HSV(准确地说是HSB) - 它是适合人类使用的颜色的格式。转换后,您需要做的就是更改H V(可能)并将其转换回RGB。

答案 1 :(得分:1)

这是一个可以让你在色调圈周围移动颜色的功能。您应该阅读HSB(或HSV)颜色系统上的维基百科页面,以真正了解正在发生的事情:http://en.wikipedia.org/wiki/HSV_color_space

/** Converts an input color given as a String such as "ab451e" to
 * the HSB color space. Shifts its hue from the given angle in degrees. 
 * Then returns the new color in the same format it was given.
 * 
 *  For example shift("ff0000", 180); returns "80ff00" (green is the opposite of red).*/
public static String shift(String rgbS, int angle) {        
    // Convert String to integer value
    int value = Integer.parseInt(rgbS, 16);

    // Separate red green and blue
    int r = value >> 16;
    int g = (value >> 8) & 0xff;
    int b = value & 0xff;

    // Convert to hsb
    float[] hsb = Color.RGBtoHSB(r, g, b, null);

    // Convert angle to floating point between 0 and 1.0
    float angleF = (float)(angle/360.0);

    // Shift the hue using the angle.
    float newAngle = hsb[0] + angleF;
    if(newAngle > 1.0)
        newAngle = newAngle - 1.0f;
    hsb[0] = newAngle;

    // Convert back to RGB, removing the alpha component
    int rgb = Color.HSBtoRGB(hsb[0], hsb[1], hsb[2]);
    rgb = rgb & 0xffffff;

    // Build a new String
    return Integer.toHexString(rgb);
}

检测颜色可能很复杂,这取决于您真正期望的结果。

如果您想要的只是一个近似值(红色,绿色,蓝色,黄色等),那么您可以查看HSB颜色空间的色调圆,为您要定义的每种颜色选择一个色调值,然后将输入的颜色映射到您选择的最接近的颜色。

您还可以依赖命名的HTML颜色:http://www.w3schools.com/html/html_colornames.asp。获取此列表,在程序中创建映射,然后您只需将您获得的颜色映射到地图中最接近的颜色,然后返回其名称。但要小心:计算两种颜色之间的距离可能很棘手(特别是在RGB中),而天真的方法(例如逐个通道的差异)可能会产生令人惊讶的糟糕结果。比色法是一个复杂的主题,您可以在此页面找到好的方法:http://en.wikipedia.org/wiki/Color_difference

答案 2 :(得分:0)

我猜您想将RGB颜色转换为HSB。你可以做到这一点:

java.awt.Color.RGBtoHSB(...)

然后您可以轻松确定H值是否适合您的蓝色定义,并将其修改为您喜欢的任何内容。在此之后,您可以通过以下方式轻松将其转换回RGB:

java.awt.Color.getHSBColor(...)

如果你不喜欢jawa.awt.color只是通过transofrmation矩阵乘以颜色矢量。

答案 3 :(得分:0)

每个HEX Color中有三个部分,红色,绿色和蓝色#标识HEX颜色,以下两个字母是红色;接下来的两个是绿色,接下来的两个是蓝色。即:RGB

这两个字母的最大十六进制值FF为255,最小值为00为零。

所以你可以这样说,我想要一个带有2个红色部分,7个绿色部分和零蓝色部分的颜色,它们会给你#020700

这就是#FFFFFF为白色(所有颜色在一起)和#000000为黑色(根本没有颜色)的原因

使用此逻辑,您可以以任何方式修改颜色; Color课程也可以提供很多帮助。