public static Color[] GetBaseColors48(Bitmap bitmap) {
var colors = new List<ColorEntry>(50);
for (var y = Padding; y < Size - Padding; y++) {
for (var x = Padding; x < Size - Padding; x++) {
var c = bitmap.GetPixel(x, y);
var h = c.GetHue();
var s = c.GetSaturation();
var b = c.GetBrightness();
var w = (1.2 - Math.Abs((double)x / Size - 0.5) - Math.Abs((double)y / Size - 0.5)).Saturate();
if (b < 0.1) continue;
w += s;
for (var i = 0; i < colors.Count; i++) {
var en = colors[i];
if (en.Distance(h, s, b) > Threshold) continue;
en.Add(h, s, b, w);
for (var j = i + 1; j < colors.Count; j++) {
var em = colors[j];
if (em.Distance(en.H, en.S, en.B) > Threshold) continue;
en.Add(em.H, em.S, em.B, em.Weight);
colors.Remove(em);
j--;
}
goto loop;
}
colors.Add(new ColorEntry(h, s, b, w));
loop:;
}
}
if (colors.Count == 0) return new Color[0];
var result = colors.OrderBy(x => -x.Weight).ToList();
return result.Where(x => x.Weight > result.ElementAt(0).Weight * 0.1).Select(x => x.Tune()).ToArray();
}