コード例 #1
0
        private void GeneratePalette()
        {
            //TODO: more ways to decide which color to get
            //Like removing similar colors (with less than 5% similarity) if there is more than 256 colors, etc.
            //I probably can do that, using the groupby method.



            ColorTable = NonIndexedPixels.GroupBy(x => x)   //Grouping based on its value
                         .OrderByDescending(g => g.Count()) //Order by most frequent values
                         .Select(g => g.FirstOrDefault())   //take the first among the group
                         .Take(MaximumNumberColor).ToList();

            //Make sure that the transparent color is added to list.
            if (TransparentColor.HasValue && (!IsFirstFrame || UseGlobalColorTable) && ColorTable.Count == MaximumNumberColor)
            {
                //Only adds if there is MaximumNumberColor colors, so I need to make sure that the color won't be ignored.
                //If there is less than MaximumNumberColor selected colors, it means that the transparent color is already selected.

                //If the color isn't on the list, add or replace.
                if (ColorTable.All(x => x != TransparentColor.Value))
                {
                    //Adds to the last spot, keeping it sorted. (Since all the colors are ordered by descending)
                    ColorTable.Insert(MaximumNumberColor - 1, TransparentColor.Value);

                    //Remove the exceding value at the last position.
                    ColorTable.RemoveAt(MaximumNumberColor);
                }
            }

            //I need to signal the other method that I won't need transparency.
            WillUseTransparency = !IsFirstFrame && TransparentColor.HasValue && ColorTable.Contains(TransparentColor.Value);
        }
コード例 #2
0
ファイル: GifFile.cs プロジェクト: rob3c/ScreenToGif
        private void GeneratePalette(string path)
        {
            var colorList = new List <Color>();

            NonIndexedPixels = new List <Color>();

            #region Get the Pixels

            var image     = path.SourceFrom();
            var pixelUtil = new PixelUtil(image);
            pixelUtil.LockBits();

            for (int x = 0; x < image.PixelWidth; x++)
            {
                for (int y = 0; y < image.PixelHeight; y++)
                {
                    colorList.Add(pixelUtil.GetPixel(x, y));
                }
            }

            pixelUtil.UnlockBits();

            #endregion

            //Save all the pixels in a property.
            NonIndexedPixels.AddRange(colorList);

            //TODO: more ways to decide which color to get
            //Like removing similar colors (with less than 5% similarity) if there is more than 256 colors, etc.
            //I probably can do that, using the groupby method.

            //if (NonIndexedPixels.Count == 100)
            //{
            //    ColorTable = new List<Color>
            //    {
            //        Color.FromRgb(255, 255, 255),
            //        Color.FromRgb(255, 0, 0),
            //        Color.FromRgb(0, 0, 255)
            //    };

            //    return;
            //}

            ColorTable = colorList.GroupBy(x => x)          //Grouping based on its value
                         .OrderByDescending(g => g.Count()) //Order by most frequent values
                         .Select(g => g.FirstOrDefault())   //take the first among the group
                         .Take(256).ToList();

            //Make sure that the transparent color is added to list.
            if (!IsFirstFrame && TransparentColor.HasValue && ColorTable.Count == 256)
            {
                //Only adds if there is 256 colors, so I need to make sure that the color won't be ignored.
                //If there is less than 256 selected colors, it means that the transparent color is already selected.

                //If the color isn't on the list, add or replace.
                if (ColorTable.All(x => x != TransparentColor.Value))
                {
                    //Adds to the last spot, keeping it sorted. (Since all the colors are ordered by descending)
                    ColorTable.Insert(255, TransparentColor.Value);

                    //Remove the exceding value at the last position.
                    ColorTable.RemoveAt(256);
                }
            }

            //I need to signal the other method that I won't need transparency.
            WillUseTransparency = TransparentColor.HasValue && ColorTable.Contains(TransparentColor.Value);
        }