如何使用RGB匹配两个几乎相同的匹配颜色

时间:2016-04-22 11:05:13

标签: android eclipse

我正在开发一个应用程序,其中我有一个元素周期表,其中元素周期表中的每个元素都有不同的颜色。现在我向用户显示一个颜色选择器,用户从选择器中选择一种颜色,我将在周期表中选择所选颜色,并显示与其对应的元素。我知道如何从选择器中选择颜色并匹配两种颜色。现在我的问题是假设周期表中的元素是红色,即#FF0000,如果用户选择的红色不是完全相同的红色代码(#FF0000)。现在在这种情况下,用户不太可能从选择器中选择确切的颜色。他可能会选择类似的红色,但代码略有不同。那么在这种情况下我将如何匹配。有没有办法在所有可能的RGB范围内匹配红色或任何特定的colr,这样如果用户选择该范围内的任何颜色,我可以将其与表格中的任何特定颜色相匹配。

2 个答案:

答案 0 :(得分:1)

步骤1:提取用户选择的颜色的3个RGB值。

int colorSelected = Color.RED;  //#FF0000
int r = (colorSelected >> 16) & 0xFF;  //255
int g = (colorSelected >> 8) & 0xFF;   //0
int b = (colorSelected >> 0) & 0xFF;   //0

第2步:定义阈值

int threshold = 15

步骤3:对于元素周期表中的每种颜色,重复步骤1,并匹配每个值在范围内

int currentCellColor = getCellColor();  //Let's say #FF0100
int currentRed = (currentCellColor >> 16) & 0xFF;  //255
int currentGreen = (currentCellColor >> 8) & 0xFF;   //0
int currentBlue = (currentCellColor >> 0) & 0xFF;   //0
if (((currentRed >= (r - threshold)) && (currentRed <= (r + threshold))
  && ((currentGreen >= (g - threshold)) && (currentGreen <= (g + threshold))
  && ((currentBlue >= (b - threshold)) && (currentBlue <= (b + threshold))) {
  //CurrentColor is within the desired threshold
} else {
  //CurrentColor is not within the desired threshold
}

从技术上讲,色谱不应该是线性的,但你应该用这种方式得到一个很好的近似值。如需进一步研究,您可以浏览https://en.wikipedia.org/wiki/Color_difference

答案 1 :(得分:0)

你可以这样做,

首先,您可以将hexacode转换为int。然后设置一些范围说20例如。然后比较两种颜色从hexa得到的int。如果差值大于范围意味着例如20,则不存在非常接近的匹配。如果它小于20,那么它非常接近匹配。

我正在编写目标c代码以转换为hexa中的数字,

unsigned result = 0;
NSScanner *scanner = [NSScanner scannerWithString:@"#FF0000"];

[scanner setScanLocation:1]; // bypass '#' character
[scanner scanHexInt:&result];

NSLog(@"result :%d",result);

所以你得到整数作为结果然后获得第二种颜色的整数并比较两个int数。如果数字根据您设定的范围非常接近,则它们匹配颜色,否则不匹配。

“如果每种颜色的差异可以忽略不计,那么每个颜色的六角代码总是唯一的”

希望这会有所帮助:)

相关问题