Java颜色代码转换为颜色名称

可以将颜色rgb代码转换成颜色名称? 像蓝色的黄色红色

  1. 填充“已知”颜色的列表。
  2. 对于每个已知的颜色计算:

    rgbDistance = Math.abs(myColor.getRed() - colorI.getRed() + Math.abs(myColor.getGreen() - colorI.getGreen()) + Math.abs(myColor.getBlue() - colorI.getBlue()) 
  3. 返回rgbDistance最小的colorI的名称。

这是一个工作示例代码 ,这样做。 它将rgb /hex值/ awt颜色转换为最接近的颜色名称。

 import java.awt.Color; import java.util.ArrayList; /** * Java Code to get a color name from rgb/hex value/awt color * * The part of looking up a color name from the rgb values is edited from * https://gist.github.com/nightlark/6482130#file-gistfile1-java (that has some errors) by Ryan Mast (nightlark) * * @author Xiaoxiao Li * */ public class ColorUtils { /** * Initialize the color list that we have. */ private ArrayList<ColorName> initColorList() { ArrayList<ColorName> colorList = new ArrayList<ColorName>(); colorList.add(new ColorName("AliceBlue", 0xF0, 0xF8, 0xFF)); colorList.add(new ColorName("AntiqueWhite", 0xFA, 0xEB, 0xD7)); colorList.add(new ColorName("Aqua", 0x00, 0xFF, 0xFF)); colorList.add(new ColorName("Aquamarine", 0x7F, 0xFF, 0xD4)); colorList.add(new ColorName("Azure", 0xF0, 0xFF, 0xFF)); colorList.add(new ColorName("Beige", 0xF5, 0xF5, 0xDC)); colorList.add(new ColorName("Bisque", 0xFF, 0xE4, 0xC4)); colorList.add(new ColorName("Black", 0x00, 0x00, 0x00)); colorList.add(new ColorName("BlanchedAlmond", 0xFF, 0xEB, 0xCD)); colorList.add(new ColorName("Blue", 0x00, 0x00, 0xFF)); colorList.add(new ColorName("BlueViolet", 0x8A, 0x2B, 0xE2)); colorList.add(new ColorName("Brown", 0xA5, 0x2A, 0x2A)); colorList.add(new ColorName("BurlyWood", 0xDE, 0xB8, 0x87)); colorList.add(new ColorName("CadetBlue", 0x5F, 0x9E, 0xA0)); colorList.add(new ColorName("Chartreuse", 0x7F, 0xFF, 0x00)); colorList.add(new ColorName("Chocolate", 0xD2, 0x69, 0x1E)); colorList.add(new ColorName("Coral", 0xFF, 0x7F, 0x50)); colorList.add(new ColorName("CornflowerBlue", 0x64, 0x95, 0xED)); colorList.add(new ColorName("Cornsilk", 0xFF, 0xF8, 0xDC)); colorList.add(new ColorName("Crimson", 0xDC, 0x14, 0x3C)); colorList.add(new ColorName("Cyan", 0x00, 0xFF, 0xFF)); colorList.add(new ColorName("DarkBlue", 0x00, 0x00, 0x8B)); colorList.add(new ColorName("DarkCyan", 0x00, 0x8B, 0x8B)); colorList.add(new ColorName("DarkGoldenRod", 0xB8, 0x86, 0x0B)); colorList.add(new ColorName("DarkGray", 0xA9, 0xA9, 0xA9)); colorList.add(new ColorName("DarkGreen", 0x00, 0x64, 0x00)); colorList.add(new ColorName("DarkKhaki", 0xBD, 0xB7, 0x6B)); colorList.add(new ColorName("DarkMagenta", 0x8B, 0x00, 0x8B)); colorList.add(new ColorName("DarkOliveGreen", 0x55, 0x6B, 0x2F)); colorList.add(new ColorName("DarkOrange", 0xFF, 0x8C, 0x00)); colorList.add(new ColorName("DarkOrchid", 0x99, 0x32, 0xCC)); colorList.add(new ColorName("DarkRed", 0x8B, 0x00, 0x00)); colorList.add(new ColorName("DarkSalmon", 0xE9, 0x96, 0x7A)); colorList.add(new ColorName("DarkSeaGreen", 0x8F, 0xBC, 0x8F)); colorList.add(new ColorName("DarkSlateBlue", 0x48, 0x3D, 0x8B)); colorList.add(new ColorName("DarkSlateGray", 0x2F, 0x4F, 0x4F)); colorList.add(new ColorName("DarkTurquoise", 0x00, 0xCE, 0xD1)); colorList.add(new ColorName("DarkViolet", 0x94, 0x00, 0xD3)); colorList.add(new ColorName("DeepPink", 0xFF, 0x14, 0x93)); colorList.add(new ColorName("DeepSkyBlue", 0x00, 0xBF, 0xFF)); colorList.add(new ColorName("DimGray", 0x69, 0x69, 0x69)); colorList.add(new ColorName("DodgerBlue", 0x1E, 0x90, 0xFF)); colorList.add(new ColorName("FireBrick", 0xB2, 0x22, 0x22)); colorList.add(new ColorName("FloralWhite", 0xFF, 0xFA, 0xF0)); colorList.add(new ColorName("ForestGreen", 0x22, 0x8B, 0x22)); colorList.add(new ColorName("Fuchsia", 0xFF, 0x00, 0xFF)); colorList.add(new ColorName("Gainsboro", 0xDC, 0xDC, 0xDC)); colorList.add(new ColorName("GhostWhite", 0xF8, 0xF8, 0xFF)); colorList.add(new ColorName("Gold", 0xFF, 0xD7, 0x00)); colorList.add(new ColorName("GoldenRod", 0xDA, 0xA5, 0x20)); colorList.add(new ColorName("Gray", 0x80, 0x80, 0x80)); colorList.add(new ColorName("Green", 0x00, 0x80, 0x00)); colorList.add(new ColorName("GreenYellow", 0xAD, 0xFF, 0x2F)); colorList.add(new ColorName("HoneyDew", 0xF0, 0xFF, 0xF0)); colorList.add(new ColorName("HotPink", 0xFF, 0x69, 0xB4)); colorList.add(new ColorName("IndianRed", 0xCD, 0x5C, 0x5C)); colorList.add(new ColorName("Indigo", 0x4B, 0x00, 0x82)); colorList.add(new ColorName("Ivory", 0xFF, 0xFF, 0xF0)); colorList.add(new ColorName("Khaki", 0xF0, 0xE6, 0x8C)); colorList.add(new ColorName("Lavender", 0xE6, 0xE6, 0xFA)); colorList.add(new ColorName("LavenderBlush", 0xFF, 0xF0, 0xF5)); colorList.add(new ColorName("LawnGreen", 0x7C, 0xFC, 0x00)); colorList.add(new ColorName("LemonChiffon", 0xFF, 0xFA, 0xCD)); colorList.add(new ColorName("LightBlue", 0xAD, 0xD8, 0xE6)); colorList.add(new ColorName("LightCoral", 0xF0, 0x80, 0x80)); colorList.add(new ColorName("LightCyan", 0xE0, 0xFF, 0xFF)); colorList.add(new ColorName("LightGoldenRodYellow", 0xFA, 0xFA, 0xD2)); colorList.add(new ColorName("LightGray", 0xD3, 0xD3, 0xD3)); colorList.add(new ColorName("LightGreen", 0x90, 0xEE, 0x90)); colorList.add(new ColorName("LightPink", 0xFF, 0xB6, 0xC1)); colorList.add(new ColorName("LightSalmon", 0xFF, 0xA0, 0x7A)); colorList.add(new ColorName("LightSeaGreen", 0x20, 0xB2, 0xAA)); colorList.add(new ColorName("LightSkyBlue", 0x87, 0xCE, 0xFA)); colorList.add(new ColorName("LightSlateGray", 0x77, 0x88, 0x99)); colorList.add(new ColorName("LightSteelBlue", 0xB0, 0xC4, 0xDE)); colorList.add(new ColorName("LightYellow", 0xFF, 0xFF, 0xE0)); colorList.add(new ColorName("Lime", 0x00, 0xFF, 0x00)); colorList.add(new ColorName("LimeGreen", 0x32, 0xCD, 0x32)); colorList.add(new ColorName("Linen", 0xFA, 0xF0, 0xE6)); colorList.add(new ColorName("Magenta", 0xFF, 0x00, 0xFF)); colorList.add(new ColorName("Maroon", 0x80, 0x00, 0x00)); colorList.add(new ColorName("MediumAquaMarine", 0x66, 0xCD, 0xAA)); colorList.add(new ColorName("MediumBlue", 0x00, 0x00, 0xCD)); colorList.add(new ColorName("MediumOrchid", 0xBA, 0x55, 0xD3)); colorList.add(new ColorName("MediumPurple", 0x93, 0x70, 0xDB)); colorList.add(new ColorName("MediumSeaGreen", 0x3C, 0xB3, 0x71)); colorList.add(new ColorName("MediumSlateBlue", 0x7B, 0x68, 0xEE)); colorList.add(new ColorName("MediumSpringGreen", 0x00, 0xFA, 0x9A)); colorList.add(new ColorName("MediumTurquoise", 0x48, 0xD1, 0xCC)); colorList.add(new ColorName("MediumVioletRed", 0xC7, 0x15, 0x85)); colorList.add(new ColorName("MidnightBlue", 0x19, 0x19, 0x70)); colorList.add(new ColorName("MintCream", 0xF5, 0xFF, 0xFA)); colorList.add(new ColorName("MistyRose", 0xFF, 0xE4, 0xE1)); colorList.add(new ColorName("Moccasin", 0xFF, 0xE4, 0xB5)); colorList.add(new ColorName("NavajoWhite", 0xFF, 0xDE, 0xAD)); colorList.add(new ColorName("Navy", 0x00, 0x00, 0x80)); colorList.add(new ColorName("OldLace", 0xFD, 0xF5, 0xE6)); colorList.add(new ColorName("Olive", 0x80, 0x80, 0x00)); colorList.add(new ColorName("OliveDrab", 0x6B, 0x8E, 0x23)); colorList.add(new ColorName("Orange", 0xFF, 0xA5, 0x00)); colorList.add(new ColorName("OrangeRed", 0xFF, 0x45, 0x00)); colorList.add(new ColorName("Orchid", 0xDA, 0x70, 0xD6)); colorList.add(new ColorName("PaleGoldenRod", 0xEE, 0xE8, 0xAA)); colorList.add(new ColorName("PaleGreen", 0x98, 0xFB, 0x98)); colorList.add(new ColorName("PaleTurquoise", 0xAF, 0xEE, 0xEE)); colorList.add(new ColorName("PaleVioletRed", 0xDB, 0x70, 0x93)); colorList.add(new ColorName("PapayaWhip", 0xFF, 0xEF, 0xD5)); colorList.add(new ColorName("PeachPuff", 0xFF, 0xDA, 0xB9)); colorList.add(new ColorName("Peru", 0xCD, 0x85, 0x3F)); colorList.add(new ColorName("Pink", 0xFF, 0xC0, 0xCB)); colorList.add(new ColorName("Plum", 0xDD, 0xA0, 0xDD)); colorList.add(new ColorName("PowderBlue", 0xB0, 0xE0, 0xE6)); colorList.add(new ColorName("Purple", 0x80, 0x00, 0x80)); colorList.add(new ColorName("Red", 0xFF, 0x00, 0x00)); colorList.add(new ColorName("RosyBrown", 0xBC, 0x8F, 0x8F)); colorList.add(new ColorName("RoyalBlue", 0x41, 0x69, 0xE1)); colorList.add(new ColorName("SaddleBrown", 0x8B, 0x45, 0x13)); colorList.add(new ColorName("Salmon", 0xFA, 0x80, 0x72)); colorList.add(new ColorName("SandyBrown", 0xF4, 0xA4, 0x60)); colorList.add(new ColorName("SeaGreen", 0x2E, 0x8B, 0x57)); colorList.add(new ColorName("SeaShell", 0xFF, 0xF5, 0xEE)); colorList.add(new ColorName("Sienna", 0xA0, 0x52, 0x2D)); colorList.add(new ColorName("Silver", 0xC0, 0xC0, 0xC0)); colorList.add(new ColorName("SkyBlue", 0x87, 0xCE, 0xEB)); colorList.add(new ColorName("SlateBlue", 0x6A, 0x5A, 0xCD)); colorList.add(new ColorName("SlateGray", 0x70, 0x80, 0x90)); colorList.add(new ColorName("Snow", 0xFF, 0xFA, 0xFA)); colorList.add(new ColorName("SpringGreen", 0x00, 0xFF, 0x7F)); colorList.add(new ColorName("SteelBlue", 0x46, 0x82, 0xB4)); colorList.add(new ColorName("Tan", 0xD2, 0xB4, 0x8C)); colorList.add(new ColorName("Teal", 0x00, 0x80, 0x80)); colorList.add(new ColorName("Thistle", 0xD8, 0xBF, 0xD8)); colorList.add(new ColorName("Tomato", 0xFF, 0x63, 0x47)); colorList.add(new ColorName("Turquoise", 0x40, 0xE0, 0xD0)); colorList.add(new ColorName("Violet", 0xEE, 0x82, 0xEE)); colorList.add(new ColorName("Wheat", 0xF5, 0xDE, 0xB3)); colorList.add(new ColorName("White", 0xFF, 0xFF, 0xFF)); colorList.add(new ColorName("WhiteSmoke", 0xF5, 0xF5, 0xF5)); colorList.add(new ColorName("Yellow", 0xFF, 0xFF, 0x00)); colorList.add(new ColorName("YellowGreen", 0x9A, 0xCD, 0x32)); return colorList; } /** * Get the closest color name from our list * * @param r * @param g * @param b * @return */ public String getColorNameFromRgb(int r, int g, int b) { ArrayList<ColorName> colorList = initColorList(); ColorName closestMatch = null; int minMSE = Integer.MAX_VALUE; int mse; for (ColorName c : colorList) { mse = c.computeMSE(r, g, b); if (mse < minMSE) { minMSE = mse; closestMatch = c; } } if (closestMatch != null) { return closestMatch.getName(); } else { return "No matched color name."; } } /** * Convert hexColor to rgb, then call getColorNameFromRgb(r, g, b) * * @param hexColor * @return */ public String getColorNameFromHex(int hexColor) { int r = (hexColor & 0xFF0000) >> 16; int g = (hexColor & 0xFF00) >> 8; int b = (hexColor & 0xFF); return getColorNameFromRgb(r, g, b); } public int colorToHex(Color c) { return Integer.decode("0x" + Integer.toHexString(c.getRGB()).substring(2)); } public String getColorNameFromColor(Color color) { return getColorNameFromRgb(color.getRed(), color.getGreen(), color.getBlue()); } /** * SubClass of ColorUtils. In order to lookup color name * * @author Xiaoxiao Li * */ public class ColorName { public int r, g, b; public String name; public ColorName(String name, int r, int g, int b) { this.r = r; this.g = g; this.b = b; this.name = name; } public int computeMSE(int pixR, int pixG, int pixB) { return (int) (((pixR - r) * (pixR - r) + (pixG - g) * (pixG - g) + (pixB - b) * (pixB - b)) / 3); } public int getR() { return r; } public int getG() { return g; } public int getB() { return b; } public String getName() { return name; } } } 

嗯,这是一个有趣的问题。 我可以想到几个解决scheme:

  1. 根据RGB值之间的关系,你可以做一些猜测(例如,如果一种颜色非常占优势,你可以猜出其中一种颜色,但是如果有其他颜色的话,你越来越可能猜测这些颜色的组合两个发出的颜色,如果所有三个接近相等,那么猜测白色,灰色或黑色取决于三个值的平均值有多高,如果两个高而另一个低,则猜测两者的组合等等。 。)

  2. 你可以去更多的学习方法,你设置了一些初步的猜测(如上),然后根据用户的反馈进行改进。

不幸的是,这个问题是相对主观的(尽pipe问题不是这样),因为人们对文化和性别之间的颜色认知差异很大(参见Randall Munroe的“研究” )。

如果你想要一个RGB值的特定子集(比如在Java或者C#中给定常量的那些,你可以遍历每个值并进行比较,如果它们不相等,最后返回一些默认值)。

[编辑]

啊! 色盲用户呃? 你有没有考虑创build一个设置,让用户指定他们有困难区分哪些颜色? 如果你这样做的话,你可以让他们知道“比绿色还要重要20%”(例如,如果他们有红绿色的色盲,这是最常见的)。 这将是非常简单的。 他们select一个像素,然后你遵循这个伪代码:

 if( userColorTrouble == RedGreen ) { int redVal = colorInQuestion.GetRed(); int greenVal = colorInQuestion.GetGreen(); if( redVal > greenVal ) { return "The color is " + (double)redVal / (redVal + greenVal) - .5d + "% redder than green"; } else { return "The color is " + (double)greenVal / (redVal + greenVal) - .5d + "% greener than red"; } } 

这可能是一个更简单,更有用的解决scheme。

并非所有的RGB值都有别名。 您可能需要创build一个包含红色,绿色,蓝色和别名值数组的数组。 然后,您将遍历该数组,比较RGB值。

http://en.wikipedia.org/wiki/List_of_colors

编辑:

样品:

 //array of known aliases and rgb values ArrayList colorList = new ArrayList(); colorList.add(new String[] {"255", "0", "0", "Red"}); //etc... Color c = new Color(255, 0, 0); //test color String name = "Unknown"; for (String[] color : colorList) { int r = Integer.parseInt(color[0]) //red value int g = Integer.parseInt(color[1]) //green value int b = Integer.parseInt(color[2]) //blue value String alias = color[3]; if ((c.getRed() == r) && (c.getGreen() == g) && (c.getBlue() == b)) { name = alias; //found it break; } } 

所有的转换像素从RGB到HSV。 在HSV中定义颜色范围要比在RGB中定义要容易得多。

 /** * *@author Tomasz Drobiszewski */ public class Color { /** * Human color table. */ public static final int [] [] colors = { {-1,-10,-360,-0,-100,-10,-80}, {1,0,360,0,100,0,50}, {2,0,360,0,15,50,130}, {3,0,360,0,15,130,210}, {4,-15,15,15,100,50,255}, {5,15,45,15,100,50,255}, {6,45,75,15,100,50,255}, {7,75,105,15,100,50,255}, {8,105,135,15,100,50,255}, {9,135,165,15,100,50,255}, {10,165,195,15,100,50,255}, {11,195,225,15,100,50,255}, {12,225,255,15,100,50,255}, {13,255,285,15,100,50,255}, {14,285,315,15,100,50,255}, {15,315,345,15,100,50,255}, {16,345,375,15,100,50,255}, {17,0,360,0,15,210,255} }; /** * Color names. */ public static final String [] humanColors = { "unrecognized", "black", //black colors[1] "grey", "light_grey", "red", "orange", "yellow", "jasny_zielony", "zielony", "zielony", "turkusowy", "jasny_niebieski", "niebieski", "fioletowy", "fioletowy", "rozowy", "czerwony", "bialy", }; /** * Convert from RGB do HSV * * @param r * @param g * @param b * @param hsv */ public static void rgb2hsv(int r, int g, int b, int hsv[]) { int min; // Min. value of RGB int max; // Max. value of RGB int delMax; // Delta RGB value if (r > g) { min = g; max = r; } else { min = r; max = g; } if (b > max) max = b; if (b < min) min = b; delMax = max - min; float H = 0, S; float V = max; if (delMax == 0) { H = 0; S = 0; } else { S = delMax / (float) max; if (r == max) H = ((g - b) / (float) delMax) * 60; else if (g == max) H = (2 + (b - r) / (float) delMax) * 60; else if (b == max) H = (4 + (r - g) / (float) delMax) * 60; } hsv[0] = (int) (H); hsv[1] = (int) (S * 100); hsv[2] = (int) V; } /** * Return human color index {@link Color#colors} * * @param r * @param g * @param b * @return */ public static int [] getHumanColor(int r, int g, int b) { int [] res = {0, 0, 0, 0}; int[] hsv = new int[3]; rgb2hsv(r, g, b, hsv); for (int i = 1; i < colors.length; i++) { if (hsv[0] <= colors[i][2] && hsv[0] >= colors[i][1] && hsv[1] <= colors[i][4] && hsv[1] >= colors[i][3] && hsv[2] <= colors[i][6] && hsv[2] >= colors[i][5]) { res[3] = i; res[0] = hsv[0]; res[1] = hsv[1]; res[2] = hsv[2]; return res; } } return res; } } 

您可以简单地构build一个查找表,例如使用Color类本身的常量:

 Map<Integer, String> map = new HashMap<Integer, String>(); for (Field f : Color.class.getFields()) { if (f.getType() == Color.class) { Color c = (Color) f.get(null); map.put(c.getRGB(), f.getName()); } } 

如果你想要@evan链接的所有HTML颜色或所有forms的维基百科,你仍然有一点功课要做。

编辑结果地图:

 0xff00ffff: CYAN 0xff0000ff: BLUE 0xffc0c0c0: LIGHT_GRAY 0xff808080: GRAY 0xffffff00: YELLOW 0xffff0000: RED 0xffffafaf: PINK 0xff000000: BLACK 0xff00ff00: GREEN 0xffffc800: ORANGE 0xff404040: DARK_GRAY 0xffff00ff: MAGENTA 0xffffffff: WHITE 

在我的情况下,我正在寻找一种快速的方法来获取所有关或所有closures的LED显示原色的名称,所以下面的function为我工作。 希望对某人有所帮助。

 public static String getColourName(int c) { String name = "UNKNOWN"; int colour = Color.BLACK; if(Color.red(c) > 127) { colour |= Color.RED; } if(Color.green(c) > 127) { colour |= Color.GREEN; } if(Color.blue(c) > 127) { colour |= Color.BLUE; } switch (colour) { case Color.BLACK: name = "BLACK"; break; case Color.BLUE: name = "BLUE"; break; case Color.GREEN: name = "GREEN"; break; case Color.CYAN: name = "CYAN"; break; case Color.RED: name = "RED"; break; case Color.MAGENTA: name = "MAGENTA"; break; case Color.YELLOW: name = "YELLOW"; break; case Color.WHITE: name = "WHITE"; break; } return name; }