Exemplo n.º 1
0
            public static IEnumerable <ColorBox> Quantize(Color[] pixels, int maxColors)
            {
                if (pixels.Length == 0)
                {
                    throw new ArgumentException("Pixel array is empty");
                }
                if (maxColors < 2 || maxColors > 256)
                {
                    throw new ArgumentOutOfRangeException("Argument maxColors should be at least 2 and maximally 256");
                }

                var histogram = GetHistogram(pixels);
                var colorBox  = ColorBox.Create(pixels, histogram);

                var queue = new PriorityQueue((a, b) => a.GetCount().CompareTo(b.GetCount()));

                queue.Push(colorBox);
                Iter(queue, _fractByPopulations * maxColors, histogram);

                var queue2 = new PriorityQueue((a, b) => (a.GetCount() * a.GetVolume()).CompareTo(b.GetCount() * b.GetVolume()));

                while (queue.Count > 0)
                {
                    queue2.Push(queue.Pop());
                }
                Iter(queue2, maxColors - queue2.Count, histogram);

                var boxes = new List <ColorBox>();

                while (queue2.Count > 0)
                {
                    boxes.Add(queue2.Pop());
                }
                return(boxes);
            }