我有十六进制格式的颜色列表(例如#000000),我想检测颜色类型(蓝色,红色,绿色等),然后将颜色类型更改为另一种颜色类型。这是可能的,并有任何框架/库此任务?Java中的颜色检测器
实施例:
我有颜色#EB1369(红色),那么我将其转换为蓝色,并且变得例如#1313EB(蓝色)。
我有十六进制格式的颜色列表(例如#000000),我想检测颜色类型(蓝色,红色,绿色等),然后将颜色类型更改为另一种颜色类型。这是可能的,并有任何框架/库此任务?Java中的颜色检测器
实施例:
我有颜色#EB1369(红色),那么我将其转换为蓝色,并且变得例如#1313EB(蓝色)。
这里有一个函数可以让你围绕色相循环移动颜色。你应该阅读维基百科页面上的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
尝试将RGB值转换为HSV(准确地说,HSB) - 它是用于人类更舒适的颜色的格式。转换后,所有你需要做的是改变H
V(可能)
并将其转换回RGB。
他需要改变色相(颜色)不是他值(〜=亮度)。还要注意,java的'Color'原生支持HSB,但不支持HSV,因此前者可能更易于使用。 – ARRG 2012-02-22 12:12:49
感谢您解决我的问题:) – IProblemFactory 2012-02-22 12:14:57
我想你喜欢将RGB颜色转换为HSB。你可以这样做wuth:
java.awt.Color.RGBtoHSB(...)
那么你可以很容易地确定whetther H值为在你蓝色的定义适合,并且将它修改为任何你喜欢的。在此之后,你可以很容易地通过其转换回RGB:
java.awt.Color.getHSBColor(...)
和IFG你不喜欢jawa.awt.color只是transofrmation矩阵乘以颜色矢量。
每个HEX颜色都有三个部分,红色,绿色和蓝色#
标识一个HEX颜色,下面两个字母是红色的量;接下来的两个是绿色的,接下来的两个是蓝色的。即:RGB
这两个字母可以具有最大十六进制值FF
这是255,最小值00
是零。
所以,你可以说这样的,我想用2层红色的部分,7个绿色部分和零个蓝色部分颜色,它会给你#020700
这就是为什么#FFFFFF
为白色(所有的颜色一起)和#000000
是黑色的(根本没有颜色)
有了这个逻辑,你可以以任何你想要的方式修改颜色; Color
类也可以帮助很多。
你怎么知道#eb1369是红色的?我的意思是我知道这是事实,但是你想用什么定义或比色法概念? – ARRG 2012-02-22 12:07:20
如果它看起来红,那么它是红色的:)但我不知道电脑如何检测颜色类型,所以这就是为什么我问这个问题... – newbie 2012-02-22 12:10:53