how could i compare colors in java?

19,996

Solution 1

Implement a similarTo() method in Color class.

Then use:

public static ArrayList<Color> ColorList(int numOfColors) {
    ArrayList<Color> colorList = new ArrayList<Color>();
    for (int i = 0; i < numOfColors; i++) {
        Color c = RandColor();
        boolean similarFound = false;
        for(Color color : colorList){
            if(color.similarTo(c)){
                 similarFound = true;
                 break;
            }
        }
        if(!similarFound){
            colorList.add(c);
        } 

    }
    return colorList;
}

To implement the similarTo:

Take a look at Color similarity/distance in RGBA color space and finding similar colors programatically. A simple approach can be:

((r2 - r1)2 + (g2 - g1)2 + (b2 - b1)2)1/2

And:

boolean similarTo(Color c){
    double distance = (c.r - this.r)*(c.r - this.r) + (c.g - this.g)*(c.g - this.g) + (c.b - this.b)*(c.b - this.b)
    if(distance > X){
        return true;
    }else{
        return false;
    }
}

However, you should find your X according to your imagination of similar.

Solution 2

I tried this and it worked very well:

Color c1 = Color.WHITE;
Color c2 = new Color(255,255,255);

if(c1.getRGB() == c2.getRGB()) 
    System.out.println("true");
else
    System.out.println("false");
}

The getRGB function returns an int value with the sum of Red Blue and Green, so we are comparing integers not objects.

Share:
19,996
Ryan Maddox
Author by

Ryan Maddox

i do java and android and python and c#

Updated on June 25, 2022

Comments

  • Ryan Maddox
    Ryan Maddox almost 2 years

    im trying to make a random color generator but i dont want similar colors to show up in the arrayList

    public class RandomColorGen {
    
    public static Color RandColor() {
        Random rand = new Random();
        float r = rand.nextFloat();
        float g = rand.nextFloat();
        float b = rand.nextFloat();
        Color c = new Color(r, g, b, 1);
        return c;
    
    }
    
    public static ArrayList<Color> ColorList(int numOfColors) {
        ArrayList<Color> colorList = new ArrayList<Color>();
        for (int i = 0; i < numOfColors; i++) {
            Color c = RandColor();
            if(similarcolors){
                dont add
            }
            colorList.add(c);
    
        }
        return colorList;
    }
    
    }
    

    I'm really confused please help :)

  • Synchro
    Synchro almost 10 years
    This may be correct but it doesn't answer the question, which is asking to find similar, not just identical colours.
  • Charles Mosndup
    Charles Mosndup about 5 years
    This can be used to solve the issue of the OSX color matching discrepancies of the Robot.getPixelColor(int x, int y).