package org.anhonesteffort.flock.util;
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("alice blue", 0xF0, 0xF8, 0xFF));
colorList.add(new ColorName("antique white", 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("blanched almond", 0xFF, 0xEB, 0xCD));
colorList.add(new ColorName("blue", 0x00, 0x00, 0xFF));
colorList.add(new ColorName("blue violet", 0x8A, 0x2B, 0xE2));
colorList.add(new ColorName("brown", 0xA5, 0x2A, 0x2A));
colorList.add(new ColorName("burly wood", 0xDE, 0xB8, 0x87));
colorList.add(new ColorName("cadet blue", 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("cornflower blue", 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("dark blue", 0x00, 0x00, 0x8B));
colorList.add(new ColorName("dark cyan", 0x00, 0x8B, 0x8B));
colorList.add(new ColorName("dark golden rod", 0xB8, 0x86, 0x0B));
colorList.add(new ColorName("dark gray", 0xA9, 0xA9, 0xA9));
colorList.add(new ColorName("dark green", 0x00, 0x64, 0x00));
colorList.add(new ColorName("dark khaki", 0xBD, 0xB7, 0x6B));
colorList.add(new ColorName("dark magenta", 0x8B, 0x00, 0x8B));
colorList.add(new ColorName("dark olive green", 0x55, 0x6B, 0x2F));
colorList.add(new ColorName("dark orange", 0xFF, 0x8C, 0x00));
colorList.add(new ColorName("dark orchid", 0x99, 0x32, 0xCC));
colorList.add(new ColorName("dark red", 0x8B, 0x00, 0x00));
colorList.add(new ColorName("dark salmon", 0xE9, 0x96, 0x7A));
colorList.add(new ColorName("dark sea green", 0x8F, 0xBC, 0x8F));
colorList.add(new ColorName("dark slate blue", 0x48, 0x3D, 0x8B));
colorList.add(new ColorName("dark slate gray", 0x2F, 0x4F, 0x4F));
colorList.add(new ColorName("dark turquoise", 0x00, 0xCE, 0xD1));
colorList.add(new ColorName("dark violet", 0x94, 0x00, 0xD3));
colorList.add(new ColorName("deep pink", 0xFF, 0x14, 0x93));
colorList.add(new ColorName("deep sky blue", 0x00, 0xBF, 0xFF));
colorList.add(new ColorName("dim gray", 0x69, 0x69, 0x69));
colorList.add(new ColorName("dodger blue", 0x1E, 0x90, 0xFF));
colorList.add(new ColorName("fire brick", 0xB2, 0x22, 0x22));
colorList.add(new ColorName("floral white", 0xFF, 0xFA, 0xF0));
colorList.add(new ColorName("forest green", 0x22, 0x8B, 0x22));
colorList.add(new ColorName("fuchsia", 0xFF, 0x00, 0xFF));
colorList.add(new ColorName("gainsboro", 0xDC, 0xDC, 0xDC));
colorList.add(new ColorName("ghost white", 0xF8, 0xF8, 0xFF));
colorList.add(new ColorName("gold", 0xFF, 0xD7, 0x00));
colorList.add(new ColorName("golden rod", 0xDA, 0xA5, 0x20));
colorList.add(new ColorName("gray", 0x80, 0x80, 0x80));
colorList.add(new ColorName("green", 0x00, 0x80, 0x00));
colorList.add(new ColorName("green yellow", 0xAD, 0xFF, 0x2F));
colorList.add(new ColorName("honey dew", 0xF0, 0xFF, 0xF0));
colorList.add(new ColorName("hot pink", 0xFF, 0x69, 0xB4));
colorList.add(new ColorName("indian red", 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("lavender blush", 0xFF, 0xF0, 0xF5));
colorList.add(new ColorName("lawn green", 0x7C, 0xFC, 0x00));
colorList.add(new ColorName("lemon chiffon", 0xFF, 0xFA, 0xCD));
colorList.add(new ColorName("light blue", 0xAD, 0xD8, 0xE6));
colorList.add(new ColorName("light coral", 0xF0, 0x80, 0x80));
colorList.add(new ColorName("light cyan", 0xE0, 0xFF, 0xFF));
colorList.add(new ColorName("light golden rod yellow", 0xFA, 0xFA, 0xD2));
colorList.add(new ColorName("light gray", 0xD3, 0xD3, 0xD3));
colorList.add(new ColorName("light green", 0x90, 0xEE, 0x90));
colorList.add(new ColorName("light pink", 0xFF, 0xB6, 0xC1));
colorList.add(new ColorName("light salmon", 0xFF, 0xA0, 0x7A));
colorList.add(new ColorName("light sea green", 0x20, 0xB2, 0xAA));
colorList.add(new ColorName("light sky blue", 0x87, 0xCE, 0xFA));
colorList.add(new ColorName("light slate gray", 0x77, 0x88, 0x99));
colorList.add(new ColorName("light steel blue", 0xB0, 0xC4, 0xDE));
colorList.add(new ColorName("light yellow", 0xFF, 0xFF, 0xE0));
colorList.add(new ColorName("lime", 0x00, 0xFF, 0x00));
colorList.add(new ColorName("lime green", 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("medium aqua marine", 0x66, 0xCD, 0xAA));
colorList.add(new ColorName("medium blue", 0x00, 0x00, 0xCD));
colorList.add(new ColorName("medium orchid", 0xBA, 0x55, 0xD3));
colorList.add(new ColorName("medium purple", 0x93, 0x70, 0xDB));
colorList.add(new ColorName("medium sea green", 0x3C, 0xB3, 0x71));
colorList.add(new ColorName("medium slate blue", 0x7B, 0x68, 0xEE));
colorList.add(new ColorName("medium spring green", 0x00, 0xFA, 0x9A));
colorList.add(new ColorName("medium turquoise", 0x48, 0xD1, 0xCC));
colorList.add(new ColorName("medium violet red", 0xC7, 0x15, 0x85));
colorList.add(new ColorName("midnight blue", 0x19, 0x19, 0x70));
colorList.add(new ColorName("mint cream", 0xF5, 0xFF, 0xFA));
colorList.add(new ColorName("misty rose", 0xFF, 0xE4, 0xE1));
colorList.add(new ColorName("moccasin", 0xFF, 0xE4, 0xB5));
colorList.add(new ColorName("navajo white", 0xFF, 0xDE, 0xAD));
colorList.add(new ColorName("navy", 0x00, 0x00, 0x80));
colorList.add(new ColorName("old lace", 0xFD, 0xF5, 0xE6));
colorList.add(new ColorName("olive", 0x80, 0x80, 0x00));
colorList.add(new ColorName("olive drab", 0x6B, 0x8E, 0x23));
colorList.add(new ColorName("orange", 0xFF, 0xA5, 0x00));
colorList.add(new ColorName("orange red", 0xFF, 0x45, 0x00));
colorList.add(new ColorName("orchid", 0xDA, 0x70, 0xD6));
colorList.add(new ColorName("pale golden rod", 0xEE, 0xE8, 0xAA));
colorList.add(new ColorName("pale green", 0x98, 0xFB, 0x98));
colorList.add(new ColorName("pale turquoise", 0xAF, 0xEE, 0xEE));
colorList.add(new ColorName("pale violet red", 0xDB, 0x70, 0x93));
colorList.add(new ColorName("papaya whip", 0xFF, 0xEF, 0xD5));
colorList.add(new ColorName("peach puff", 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("powder blue", 0xB0, 0xE0, 0xE6));
colorList.add(new ColorName("purple", 0x80, 0x00, 0x80));
colorList.add(new ColorName("red", 0xFF, 0x00, 0x00));
colorList.add(new ColorName("rosy brown", 0xBC, 0x8F, 0x8F));
colorList.add(new ColorName("royal blue", 0x41, 0x69, 0xE1));
colorList.add(new ColorName("saddle brown", 0x8B, 0x45, 0x13));
colorList.add(new ColorName("salmon", 0xFA, 0x80, 0x72));
colorList.add(new ColorName("sandy brown", 0xF4, 0xA4, 0x60));
colorList.add(new ColorName("sea green", 0x2E, 0x8B, 0x57));
colorList.add(new ColorName("sea shell", 0xFF, 0xF5, 0xEE));
colorList.add(new ColorName("sienna", 0xA0, 0x52, 0x2D));
colorList.add(new ColorName("silver", 0xC0, 0xC0, 0xC0));
colorList.add(new ColorName("sky blue", 0x87, 0xCE, 0xEB));
colorList.add(new ColorName("slate blue", 0x6A, 0x5A, 0xCD));
colorList.add(new ColorName("slate gray", 0x70, 0x80, 0x90));
colorList.add(new ColorName("snow", 0xFF, 0xFA, 0xFA));
colorList.add(new ColorName("spring green", 0x00, 0xFF, 0x7F));
colorList.add(new ColorName("steel blue", 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("white smoke", 0xF5, 0xF5, 0xF5));
colorList.add(new ColorName("yellow", 0xFF, 0xFF, 0x00));
colorList.add(new ColorName("yellow green", 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);
}
/**
* 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;
}
}
}