Last active
March 22, 2024 14:47
-
-
Save XiaoxiaoLi/8031146 to your computer and use it in GitHub Desktop.
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 by Ryan Mast (nightlark)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} | |
} |
Nice work on this. I converted to an Excel LAMBDA function and referenced your Gist!
https://gist.github.com/ExcelRobot/472d11849e412aa766aeb5184f2908f9
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
You could improve the lookup performance by partitioning colors into RGB chunks.
Example:
(0xF0&0xF0)<<4|(0xF8&0xF0)|(0xFF&0xF0)>>4=FFF
AliceBlue goes into chunk FFFsame FFF chunk for
"Azure", 0xF0, 0xFF, 0xFF)
and"Ivory", 0xFF, 0xFF, 0xF0
You end up with colors spread into 4096 chunks. When you want to compare with input color, you just get the chunk number of the input color, and only compare RGB colors of the same chunk.
Ultimately, instead of partitions, you can store named colors into a binary tree structure that gets very efficient to walk.