/// <summary> /// See <see cref="BaseColorCacheQuantizer.OnGetPaletteToCache"/> for more details. /// </summary> protected override List <Color> OnGetPaletteToCache(Int32 colorCount) { // otherwise calculate one palette.Clear(); // lucky seed :) FastRandom random = new FastRandom(13); #if (UseDictionary) List <DistinctColorInfo> colorInfoList = colorMap.Values.ToList(); #else List <DistinctColorInfo> colorInfoList = rootBucket.GetValues().ToList(); #endif foundColorCount = colorInfoList.Count; if (foundColorCount >= colorCount) { // shuffles the colormap colorInfoList = colorInfoList. OrderBy(entry => random.Next(foundColorCount)). ToList(); // workaround for backgrounds, the most prevalent color DistinctColorInfo background = colorInfoList.MaxBy(info => info.Count); colorInfoList.Remove(background); colorCount--; ColorHueComparer hueComparer = new ColorHueComparer(); ColorSaturationComparer saturationComparer = new ColorSaturationComparer(); ColorBrightnessComparer brightnessComparer = new ColorBrightnessComparer(); // generates catalogue List <IEqualityComparer <DistinctColorInfo> > comparers = new List <IEqualityComparer <DistinctColorInfo> > { hueComparer, saturationComparer, brightnessComparer }; // take adequate number from each slot while (ProcessList(colorCount, colorInfoList, comparers, out colorInfoList)) { } Int32 listColorCount = colorInfoList.Count(); if (listColorCount > 0) { Int32 allowedTake = Math.Min(colorCount, listColorCount); colorInfoList = colorInfoList.Take(allowedTake).ToList(); } // adds background color first palette.Add(Color.FromArgb(background.Color)); } // adds the selected colors to a final palette palette.AddRange(colorInfoList.Select(colorInfo => Color.FromArgb(colorInfo.Color))); // returns our new palette return(palette); }
public void StoreColor(Color color) { Int32 redIndex = color.R >> 5; DistinctBucket redBucket = Buckets[redIndex]; if (redBucket == null) { redBucket = new DistinctBucket(); Buckets[redIndex] = redBucket; } Int32 greenIndex = color.G >> 5; DistinctBucket greenBucket = redBucket.Buckets[greenIndex]; if (greenBucket == null) { greenBucket = new DistinctBucket(); redBucket.Buckets[greenIndex] = greenBucket; } Int32 blueIndex = color.B >> 5; DistinctBucket blueBucket = greenBucket.Buckets[blueIndex]; if (blueBucket == null) { blueBucket = new DistinctBucket(); greenBucket.Buckets[blueIndex] = blueBucket; } DistinctColorInfo colorInfo = blueBucket.ColorInfo; if (colorInfo == null) { colorInfo = new DistinctColorInfo(color); blueBucket.ColorInfo = colorInfo; } else { colorInfo.IncreaseCount(); } }