2012-02-22 80 views
1

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

实施例:

我有颜色#EB1369(红色),那么我将其转换为蓝色,并且变得例如#1313EB(蓝色)。

+0

你怎么知道#eb1369是红色的?我的意思是我知道这是事实,但是你想用什么定义或比色法概念? – ARRG 2012-02-22 12:07:20

+0

如果它看起来红,那么它是红色的:)但我不知道电脑如何检测颜色类型,所以这就是为什么我问这个问题... – newbie 2012-02-22 12:10:53

回答

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

1

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

+0

他需要改变色相(颜色)不是他值(〜=亮度)。还要注意,java的'Color'原生支持HSB,但不支持HSV,因此前者可能更易于使用。 – ARRG 2012-02-22 12:12:49

+0

感谢您解决我的问题:) – IProblemFactory 2012-02-22 12:14:57

0

我想你喜欢将RGB颜色转换为HSB。你可以这样做wuth:

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

那么你可以很容易地确定whetther H值为在你蓝色的定义适合,并且将它修改为任何你喜欢的。在此之后,你可以很容易地通过其转换回RGB:

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

和IFG你不喜欢jawa.awt.color只是transofrmation矩阵乘以颜色矢量。

0

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

这两个字母可以具有最大十六进制值FF这是255,最小值00是零。

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

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

有了这个逻辑,你可以以任何你想要的方式修改颜色; Color类也可以帮助很多。