This works like a charm! Thanks, Mike
On 2012-01-10, at 3:03 PM, Nonsanity wrote: > Both look like good suggestions for getting the closest color a human would > think is a "match", but both involve converting Livecode's native RGB to > another format. I may be wrong, but I don't think those conversions are > available built-in. I'm sure functions have been written to do this many > times, but it's not trivial to do from scratch. If you can get one, then > the following code will still work - It'll just work better. (Replace the > r, g, b variable names with the appropriate letters for clarity.) > > Depending on your use case, you may not need to be that human-accurate, in > which case you can do the same calculation in RGB space. The square root > calculation in your two solutions is a way to get the distance between any > two points in three dimensional space. All three color formats have three > values, so they can all be pictured as a cube of space with colors as > points within that space. Your starting color is in there too, and you just > have to check the distance from it to all the other color points, and > return the shortest. > > I'm typing this in a mail program, so it is untested... > > function Distance3D( x1, y1, z1, x2, y2, z2 ) > return sqrt( (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) + (z1-z2)*(z1-z2) ) > end Distance3D > > function GetClosestColor( r, g, b ) > put 99999 into ClosestDist > put r &"," g &","& b into ClosestColor > repeat for each line c of gColorList > get Distance3D( r, g, b, item 1 of c, item 2 of c, item 3 of c ) > if it < ClosestDist then > put it into ClosestDist > put c into ClosestColor > end if > end repeat > return ClosestColor > end GetClosestColor > > > You'd have your colors in gColorList like this: > 32,32,128 > 255,255,255 > 0,0,0 > 128,128,256 > (etc) > > > ~ Chris Innanen > ~ Nonsanity > > > > On Tue, Jan 10, 2012 at 1:13 PM, Michael Doub <[email protected]> wrote: > >> I have a list of RGB colors that represent different color samples. I >> need to create a function that will return the closest perceived RGB entry >> in the list when supplied a single RGB value. Is anyone aware of a library >> or some sample code that would help with this task? >> >> From searching I found the follow two suggestions for solving this >> problem. Neither are not intuitively obvious to the casual >> observer...namely me. ;-) >> >> >> 1) "Convert RGB to CIE Lab color space, then compute the distance in that >> space ( deltaE = sqrt(deltaL^2 + deltaA^2 + deltaB^2). Colors with the >> lowest deltaE are the most perceptually similar to each other." >> >> 2) "Convert to RGB to HSL and consider an HSL color value a vector and >> define a weighted modulus function for the vector like this: >> modulus = sqrt(a*H1*H1 + b*S1*S1 + c*L1*L1); where a,b,c are weights you >> should decide based on your visual definition of what creates a bigger >> difference in perceived color - a 1% change in Hue or a 1% change in >> Saturation. I would suggest you use a = b = 0.5 and c = 1 Finally, find >> out the range your modulus would take and define similar colors to be those >> which have their moduli very close to each other (say 5%)" >> >> Regards, >> Mike >> >> >> _______________________________________________ >> use-livecode mailing list >> [email protected] >> Please visit this url to subscribe, unsubscribe and manage your >> subscription preferences: >> http://lists.runrev.com/mailman/listinfo/use-livecode >> > _______________________________________________ > use-livecode mailing list > [email protected] > Please visit this url to subscribe, unsubscribe and manage your subscription > preferences: > http://lists.runrev.com/mailman/listinfo/use-livecode _______________________________________________ use-livecode mailing list [email protected] Please visit this url to subscribe, unsubscribe and manage your subscription preferences: http://lists.runrev.com/mailman/listinfo/use-livecode
