我正在开发一个应用程序,其中我有一个元素周期表,其中元素周期表中的每个元素都有不同的颜色。现在我向用户显示一个颜色选择器,用户从选择器中选择一种颜色,我将在周期表中选择所选颜色,并显示与其对应的元素。我知道如何从选择器中选择颜色并匹配两种颜色。现在我的问题是假设周期表中的元素是红色,即#FF0000,如果用户选择的红色不是完全相同的红色代码(#FF0000)。现在在这种情况下,用户不太可能从选择器中选择确切的颜色。他可能会选择类似的红色,但代码略有不同。那么在这种情况下我将如何匹配。有没有办法在所有可能的RGB范围内匹配红色或任何特定的colr,这样如果用户选择该范围内的任何颜色,我可以将其与表格中的任何特定颜色相匹配。
答案 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数。如果数字根据您设定的范围非常接近,则它们匹配颜色,否则不匹配。
“如果每种颜色的差异可以忽略不计,那么每个颜色的六角代码总是唯一的”
希望这会有所帮助:)