Colour code snippets

I needed to sort a given colour palette by certain criterias, for example by luminance, saturation or by proximity to another colour. This, for instance, comes quite handy when trying to bias a random colour choice using a fixed palette (e.g. favour darker over brighter colours in the palette or pick more yellow shades than blue). Am sure such a readymade util exists in some form, but sometimes writing stuff yourself is quicker and more worthwhile than googling for it. So DIY won yet again with the 3 results below:

/** * sorts a given colour palette by saturation * @param cols array of integers in standard packed (A)RGB format * @return sorted version of array with element at last index * containing the most saturated item of the palette */int[] sortBySaturation(int[] cols) {  int[] sorted=new int[cols.length];  Hashtable ht=new Hashtable();  for(int i=0; i<cols.length; i++) {    int r=(cols[i]>>16) & 0xff;    int g=(cols[i]>>8) & 0xff;    int b=cols[i] & 0xff;    int maxComp = max(r,g,b);    if (maxComp > 0) {      sorted[i]=(int)((maxComp - min(r,g,b)) / (float)maxComp * 0×7fffffff);    }     else      sorted[i]=0;    ht.put(new Integer(sorted[i]),new Integer(cols[i]));  }  sorted=sort(sorted);  for(int i=0; i<sorted.length; i++) {    sorted[i]=((Integer)ht.get(new Integer(sorted[i]))).intValue();  }  return sorted;}

/** * sorts a given colour palette by luminance * @param cols array of integers in standard packed (A)RGB format * @return sorted version of array with element at last index * containing the “brightest” item of the palette */

int[] sortByLuminance(int[] cols) {  int[] sorted=new int[cols.length];  Hashtable ht=new Hashtable();  for(int i=0; i<cols.length; i++) {    // luminance = 0.3*red + 0.59*green + 0.11*blue    // same equation in fixed point math…    sorted[i]=(77*(cols[i]>>16&0xff) + 151*(cols[i]>>8&0xff) + 28*(cols[i]&0xff));    ht.put(new Integer(sorted[i]),new Integer(cols[i]));  }  sorted=sort(sorted);  for(int i=0; i<sorted.length; i++) {    sorted[i]=((Integer)ht.get(new Integer(sorted[i]))).intValue();  }  return sorted;}

/** * sorts a given colour palette by proximity to a colour * @param cols array of integers in standard packed (A)RGB format * @param basecol colour to which proximity of all palette items is calculated * @return sorted version of array with element at first index * containing the “closest” item of the palette */

int[] sortByProximity(int[] cols,int basecol) {  int[] sorted=new int[cols.length];  Hashtable ht=new Hashtable();  int br=(basecol>>16) & 0xff;  int bg=(basecol>>8) & 0xff;  int bb=basecol & 0xff;  for(int i=0; i<cols.length; i++) {    int r=(cols[i]>>16) & 0xff;    int g=(cols[i]>>8) & 0xff;    int b=cols[i] & 0xff;    sorted[i]=(br-r)*(br-r)+(bg-g)*(bg-g)+(bb-b)*(bb-b);    ht.put(new Integer(sorted[i]),new Integer(cols[i]));  }  sorted=sort(sorted);  for(int i=0; i<sorted.length; i++) {    sorted[i]=((Integer)ht.get(new Integer(sorted[i]))).intValue();  }  return sorted;}

Added bonus: Using a webcam and applying the 2nd function (sortByLuminance) to the contents of the current pixel buffer, you can instantly and possibly unintentionally create a close copy of this “amazing” piece of “infoviz” concept art… Sorted! :)

Also, I wasn’t sure whether I should continue posting code snippets like this to this blog. A year ago I set up an account with Code Snippets which used to be more Ruby, JS and generally webdev oriented, but meanwhile has quite a big range of languages and subjects covered. Then of course there’s also Processinghacks, but it didn’t seem fitting for this either…