示例#1
0
        //Metoda zwracająca bitmapę po zastosowaniu redukcji kolorów metodą algorytmu popularnościowego
        public Bitmap GenerateBitmap(RGBColor[,] colors, IFilter filter)
        {
            //szerokość i wysokość obrazu
            int    width  = colors.GetLength(0);
            int    height = colors.GetLength(1);
            Bitmap bitmap = new Bitmap(width, height);

            //tablica w której będziemy zapisywać ilość wystąpień określonych kolorów
            int[,,] histogram = new int[256, 256, 256];

            //lista aktywnych kolorów tzn tych które wystąpiły w obrazie
            List <ColorEntity> activeColors = new List <ColorEntity>();
            RGBColor           currentColor;

            //zliczamy wystąpienia kolorów
            for (int i = 0; i < width; i++)
            {
                for (int j = 0; j < height; j++)
                {
                    currentColor = colors[i, j];
                    //jeśli dany kolor jeszcze nie wystąpił to dodajemy go do aktywnych kolorów
                    if (histogram[currentColor.R, currentColor.G, currentColor.B] == 0)
                    {
                        activeColors.Add(new ColorEntity(currentColor));
                    }
                    histogram[currentColor.R, currentColor.G, currentColor.B]++;
                }
            }

            //dla każdego z aktywnych kolorów przypisujemy mu ilość wystąpień na bitmapie
            foreach (var c in activeColors)
            {
                c.Count = histogram[c.RGBColor.R, c.RGBColor.G, c.RGBColor.B];
            }

            //sortujemy aktywne kolory i ucinamy do zadanej liczby kolorów
            activeColors.Sort();
            if (activeColors.Count > RGBColor.NumOfColors)
            {
                activeColors.RemoveRange(RGBColor.NumOfColors, activeColors.Count - RGBColor.NumOfColors);
            }

            //tworzymy nową bitmapę o zredukowanej ilości kolorów
            for (int i = 0; i < width; i++)
            {
                for (int j = 0; j < height; j++)
                {
                    RGBColor closestColor = colors[i, j].FindClosestColor(activeColors);
                    bitmap.SetPixel(i, j, closestColor.GetColor());
                }
            }

            return(bitmap);
        }