如何使用十六进制代码检测所有色调?
How to detect all color tones by using hex codes?
我正在尝试开发一个 Android 应用程序,它会拍摄一个物体的照片,然后检测该物体的颜色。我想向用户显示哪种颜色有对象。借助我在 link:
中问题的答案,我根据密度和亮度实现了检测颜色
此时,我可以将颜色作为十六进制代码获取。我真正想做的是能够告知用户该十六进制代码是哪种颜色。
我不想将我的应用程序限制为检测主要颜色,所以我希望它检测许多不同的颜色。
如何使用这些十六进制代码来完成此操作?
提前致谢。
经过大量努力为我的问题找到有效的解决方案,我终于找到了!任何将面临此问题的人都可以在下面找到替代解决方案:
生成一种方法来查找数据库中最接近的颜色名称:
private String findClosedColor(String hexColor) {
int rgb[] = hexToRGB(hexColor);
int min = 3 * (int) pow(256, 2) + 1;
ArrayList<HashMap<String, String>> colorList = getColorList();
String colorName = null;
int i;
int len = colorList.size();
for (i = 0; i < len; i++) {
HashMap<String, String> map = colorList.get(i);
String colorCode = map.get("code");
Log.w("myApp", "HashMap'ten gelen colorCode:" + colorCode);
if (colorCode != null) {
int df = rgbDistance(hexToRGB(colorCode), rgb);
if (df < min) {
min = df;
colorName = map.get("name");
}
}
}
return colorName;
}
private int rgbDistance(int[] c1, int[] c2) {
return ( (int) pow(c1[0] - c2[0], 2)) + ((int) pow(c1[1] - c2[1], 2)) + ((int) pow(c1[2] - c2[2], 2));
}
private int[] hexToRGB( String hexCode)
{
int returnValue[] = new int[3];
if (hexCode.charAt(0) == '#')
{
hexCode = hexCode.substring(1);
}
if (hexCode.length() < 6)
{
returnValue[0] = -1;
returnValue[1] = -1;
returnValue[2] = -1;
}
else
{
int r = fromHex(hexCode.substring(0, 2));
int g = fromHex(hexCode.substring(2, 4));
int b = fromHex(hexCode.substring(4, 6));
returnValue[0] = r;
returnValue[1] = g;
returnValue[2] = b;
}
return returnValue;
}
private int fromHex( String n) {
n = n.toUpperCase();
if (n.length() < 2)
return -1;
int f1 = letterToCode(n.charAt(0));
int f2 = letterToCode(n.charAt(1));
if (f1 == -1 || f2 == -1) {
return -1;
} else {
return f1 * 16 + f2;
}
}
private int letterToCode(char n) {
switch (n) {
case '0': return 0;
case '1': return 1;
case '2': return 2;
case '3': return 3;
case '4': return 4;
case '5': return 5;
case '6': return 6;
case '7': return 7;
case '8': return 8;
case '9': return 9;
case 'A': return 10;
case 'B': return 11;
case 'C': return 12;
case 'D': return 13;
case 'E': return 14;
case 'F': return 15;
default: return -1;
}
}
getColorList() 函数 returns 来自我的数据库的颜色列表。使用此解决方案,我可以通过在我的数据库中选择更接近的名称来轻松检测每个十六进制代码。
向大家致以最诚挚的问候...
我正在尝试开发一个 Android 应用程序,它会拍摄一个物体的照片,然后检测该物体的颜色。我想向用户显示哪种颜色有对象。借助我在 link:
中问题的答案,我根据密度和亮度实现了检测颜色此时,我可以将颜色作为十六进制代码获取。我真正想做的是能够告知用户该十六进制代码是哪种颜色。
我不想将我的应用程序限制为检测主要颜色,所以我希望它检测许多不同的颜色。
如何使用这些十六进制代码来完成此操作?
提前致谢。
经过大量努力为我的问题找到有效的解决方案,我终于找到了!任何将面临此问题的人都可以在下面找到替代解决方案:
生成一种方法来查找数据库中最接近的颜色名称:
private String findClosedColor(String hexColor) {
int rgb[] = hexToRGB(hexColor);
int min = 3 * (int) pow(256, 2) + 1;
ArrayList<HashMap<String, String>> colorList = getColorList();
String colorName = null;
int i;
int len = colorList.size();
for (i = 0; i < len; i++) {
HashMap<String, String> map = colorList.get(i);
String colorCode = map.get("code");
Log.w("myApp", "HashMap'ten gelen colorCode:" + colorCode);
if (colorCode != null) {
int df = rgbDistance(hexToRGB(colorCode), rgb);
if (df < min) {
min = df;
colorName = map.get("name");
}
}
}
return colorName;
}
private int rgbDistance(int[] c1, int[] c2) {
return ( (int) pow(c1[0] - c2[0], 2)) + ((int) pow(c1[1] - c2[1], 2)) + ((int) pow(c1[2] - c2[2], 2));
}
private int[] hexToRGB( String hexCode)
{
int returnValue[] = new int[3];
if (hexCode.charAt(0) == '#')
{
hexCode = hexCode.substring(1);
}
if (hexCode.length() < 6)
{
returnValue[0] = -1;
returnValue[1] = -1;
returnValue[2] = -1;
}
else
{
int r = fromHex(hexCode.substring(0, 2));
int g = fromHex(hexCode.substring(2, 4));
int b = fromHex(hexCode.substring(4, 6));
returnValue[0] = r;
returnValue[1] = g;
returnValue[2] = b;
}
return returnValue;
}
private int fromHex( String n) {
n = n.toUpperCase();
if (n.length() < 2)
return -1;
int f1 = letterToCode(n.charAt(0));
int f2 = letterToCode(n.charAt(1));
if (f1 == -1 || f2 == -1) {
return -1;
} else {
return f1 * 16 + f2;
}
}
private int letterToCode(char n) {
switch (n) {
case '0': return 0;
case '1': return 1;
case '2': return 2;
case '3': return 3;
case '4': return 4;
case '5': return 5;
case '6': return 6;
case '7': return 7;
case '8': return 8;
case '9': return 9;
case 'A': return 10;
case 'B': return 11;
case 'C': return 12;
case 'D': return 13;
case 'E': return 14;
case 'F': return 15;
default: return -1;
}
}
getColorList() 函数 returns 来自我的数据库的颜色列表。使用此解决方案,我可以通过在我的数据库中选择更接近的名称来轻松检测每个十六进制代码。
向大家致以最诚挚的问候...