private Color GetClosestColor( int red, int green, int blue, out byte colorIndex )
{
Color color = Color.FromArgb( red, green, blue );
if ( ( useCaching ) && ( cache.ContainsKey( color ) ) )
{
colorIndex = cache[color];
}
else
{
colorIndex = 0;
int minError = int.MaxValue;
for ( int i = 0, n = colorTable.Length; i < n; i++ )
{
int dr = red - colorTable[i].R;
int dg = green - colorTable[i].G;
int db = blue - colorTable[i].B;
int error = dr * dr + dg * dg + db * db;
if ( error < minError )
{
minError = error;
colorIndex = (byte) i;
}
}
if ( useCaching )
{
cache.Add( color, colorIndex );
}
}
return colorTable[colorIndex];
}
}