Пример #1
0
        public void TestColorUsageOccurrences()
        {
            IndexedImage image = new IndexedImage {
                Size = new Size(3, 2)
            };

            image.Pixels[0] = 1;
            image.Pixels[1] = 2;
            image.Pixels[2] = 3;
            image.Pixels[3] = 1;
            image.Pixels[4] = 4;
            image.Pixels[5] = 2;
            image.CompletePalette();

            Assert.AreEqual(4, image.Palette.Count);
            PaletteTest.AssertColorInPalette(image.Palette, 1, 1, 0, 3);
            PaletteTest.AssertColorInPalette(image.Palette, 2, 2, 1, 5);
            PaletteTest.AssertColorInPalette(image.Palette, 3, 3, 2);
            PaletteTest.AssertColorInPalette(image.Palette, 4, 4, 4);

            image[1, 1] = new Color(1);

            Assert.AreEqual(3, image.Palette.Count);
            PaletteTest.AssertColorInPalette(image.Palette, 1, 1, 0, 3, 4);

            image[1, 1] = new Color(5);

            Assert.AreEqual(4, image.Palette.Count);
            PaletteTest.AssertColorInPalette(image.Palette, 1, 1, 0, 3);
            PaletteTest.AssertColorInPalette(image.Palette, 5, 5, 4);
        }
Пример #2
0
        public void TestPixels()
        {
            IndexedImage image = new IndexedImage {
                Size = new Size(3, 2)
            };

            image.Pixels[0] = 1;
            image.Pixels[1] = 2;
            image.Pixels[2] = 3;
            image.Pixels[3] = 4;
            image.Pixels[4] = 5;
            image.Pixels[5] = 6;
            image.CompletePalette();

            Assert.AreEqual(1, image[0, 0].Argb);
            Assert.AreEqual(2, image[1, 0].Argb);
            Assert.AreEqual(3, image[2, 0].Argb);
            Assert.AreEqual(4, image[0, 1].Argb);
            Assert.AreEqual(5, image[1, 1].Argb);
            Assert.AreEqual(6, image[2, 1].Argb);

            image[0, 0] = new Color(100);
            image[1, 0] = new Color(200);
            image[2, 0] = new Color(400);
            image[0, 1] = new Color(800);
            image[1, 1] = new Color(1600);
            image[2, 1] = new Color(3200);

            Assert.AreEqual(100, image.Pixels[0]);
            Assert.AreEqual(200, image.Pixels[1]);
            Assert.AreEqual(400, image.Pixels[2]);
            Assert.AreEqual(800, image.Pixels[3]);
            Assert.AreEqual(1600, image.Pixels[4]);
            Assert.AreEqual(3200, image.Pixels[5]);
        }
Пример #3
0
        public void TestNewColor()
        {
            CodedPalette palette =
                new CodedPalette
            {
                new Color(1),
                new CodedColor(2)
            };

            Assert.AreEqual(typeof(CodedColor), palette[1].GetType());
            Assert.AreEqual(typeof(CodedColor), palette[2].GetType());

            IndexedImage image = new IndexedImage {
                Size = new Size(2, 2)
            };

            int[] pixels;
            using (image.LockPixels(out pixels))
            {
                pixels[0] = 0;
                pixels[1] = 1;
                pixels[2] = 2;
                pixels[3] = 1;
            }

            image.Palette = new CodedPalette();
            image.CompletePalette();

            Assert.AreEqual(3, image.Palette.Count);
            foreach (var color in image.Palette)
            {
                Assert.AreEqual(typeof(CodedColor), color.GetType());
            }
        }
Пример #4
0
        public void TestClone()
        {
            IndexedImage image = new IndexedImage {
                Size = new Size(3, 2)
            };

            image.Pixels[0] = 1;
            image.Pixels[1] = 2;
            image.Pixels[2] = 3;
            image.Pixels[3] = 1;
            image.Pixels[4] = 4;
            image.Pixels[5] = 2;
            image.CompletePalette();

            IndexedImage clonedImage = image.Clone(true, true);

            Assert.AreEqual(image.Size, clonedImage.Size);

            Assert.AreEqual(image.Pixels.Length, clonedImage.Pixels.Length);
            Assert.AreNotSame(image.Pixels, clonedImage.Pixels);
            Assert.AreEqual(image.Pixels[0], clonedImage.Pixels[0]);
            Assert.AreEqual(image.Pixels[1], clonedImage.Pixels[1]);
            Assert.AreEqual(image.Pixels[2], clonedImage.Pixels[2]);
            Assert.AreEqual(image.Pixels[3], clonedImage.Pixels[3]);
            Assert.AreEqual(image.Pixels[4], clonedImage.Pixels[4]);
            Assert.AreEqual(image.Pixels[5], clonedImage.Pixels[5]);

            Assert.AreEqual(image.Palette.Count, clonedImage.Palette.Count);
            Assert.AreNotSame(image.Palette, clonedImage.Palette);
            Assert.AreEqual(image.Palette[1], clonedImage.Palette[1]);
            Assert.AreEqual(image.Palette[2], clonedImage.Palette[2]);
            Assert.AreEqual(image.Palette[3], clonedImage.Palette[3]);
            Assert.AreEqual(image.Palette[4], clonedImage.Palette[4]);

            clonedImage[0, 0] = new Color(100);

            Assert.AreEqual(100, clonedImage.Pixels[0]);
            Assert.AreEqual(1, image.Pixels[0], "Changes in cloned image should not change original");
            Assert.AreEqual(5, clonedImage.Palette.Count);
            Assert.AreEqual(4, image.Palette.Count, "Changes in cloned image should not change original");

            PaletteTest.AssertColorInPalette(clonedImage.Palette, 100, 100, 0);
            PaletteTest.AssertColorInPalette(clonedImage.Palette, 1, 1, 3);
            PaletteTest.AssertColorInPalette(image.Palette, 1, 1, 0, 3);
        }
Пример #5
0
        /// <summary>
        /// Makes color quantization on <see cref="IndexedImage"/> object.
        /// </summary>
        /// <param name="sourceImage">The source <see cref="IndexedImage"/> object.</param>
        /// <param name="colorsCount">New count for color quantization.</param>
        /// <param name="destPalette">Palette with destination colors.</param>
        /// <param name="sample">Sample of pixels for clasterization (1 = all pixels, n = 1/n pixels).</param>
        /// <param name="ditherLevel">Specifies level of image dithering (0-10).</param>
        /// <param name="orderColorsByUsage">Enable additional refining step with ordering colors by usage count before substituting into destination palette.</param>
        /// <param name="destImage">Destionation <see cref="IndexedImage"/> object or null.</param>
        /// <param name="ensureBlackAndWhiteColors">Ensures that Black and White colors are included into <see cref="colorsCount"/> selected colors.</param>
        /// <param name="randomInitColorsPercent">Percent of colors pre-initialized with random value.</param>
        /// <returns>New or updated quantized <see cref="IndexedImage"/> object.</returns>
        public IndexedImage QuantizeColors(IndexedImage sourceImage, int colorsCount, Palette destPalette = null, int sample = 1, int ditherLevel = 0, bool orderColorsByUsage = true, IndexedImage destImage = null, bool ensureBlackAndWhiteColors = false, int randomInitColorsPercent = 0)
        {
            sourceImage.CompletePalette();             // For using in colors substituting

            this.ensureBlackAndWhiteColors = ensureBlackAndWhiteColors;
            var minColorsCount = Math.Min(colorsCount, destPalette?.Count ?? -1);

            if (sourceImage.Palette.Count <= minColorsCount)
            {
                var quickImage =
                    (ditherLevel > 0)
                                                ? DitherNewImageWithPalette(sourceImage, destPalette, ditherLevel, destImage)
                                                : CreateNewImageWithPalette(sourceImage, destPalette, destImage);
                quickImage.CompletePalette();
                if (quickImage.Palette.Count <= minColorsCount)
                {
                    return(quickImage);
                }
            }

            InitilizeGlobalVariables(colorsCount, sample);
            InitializeArrays(sourceImage.Palette, randomInitColorsPercent);

            var palette = GenerateOutputPalette(sourceImage);

            if (destPalette != null)
            {
                if (orderColorsByUsage)
                {
                    UpdateUsagesCounts(palette, sourceImage);
                }
                palette.SubstColorsFromPalette(destPalette);
            }

            var resultImage =
                (ditherLevel > 0)
                                        ? DitherNewImageWithPalette(sourceImage, palette, ditherLevel, destImage)
                                        : CreateNewImageWithPalette(sourceImage, palette, destImage);

            resultImage.CompletePalette();

            return(resultImage);
        }
Пример #6
0
        public void TestLockPixels()
        {
            IndexedImage image = new IndexedImage {
                Size = new Size(3, 2)
            };

            int[] pixels;
            using (image.LockPixels(out pixels))
            {
                Assert.IsNotNull(pixels);

                pixels[0] = 1;
                pixels[1] = 2;
                pixels[2] = 3;
                pixels[3] = 4;
                pixels[4] = 5;
                pixels[5] = 6;
            }

            Assert.AreEqual(0, image.Palette.Count);
            image.CompletePalette();
            Assert.AreEqual(6, image.Palette.Count);

            Assert.AreEqual(1, image[0, 0].Argb);
            Assert.AreEqual(2, image[1, 0].Argb);
            Assert.AreEqual(3, image[2, 0].Argb);
            Assert.AreEqual(4, image[0, 1].Argb);
            Assert.AreEqual(5, image[1, 1].Argb);
            Assert.AreEqual(6, image[2, 1].Argb);

            PaletteTest.AssertColorInPalette(image.Palette, 1, 1, 0);
            PaletteTest.AssertColorInPalette(image.Palette, 2, 2, 1);
            PaletteTest.AssertColorInPalette(image.Palette, 3, 3, 2);
            PaletteTest.AssertColorInPalette(image.Palette, 4, 4, 3);
            PaletteTest.AssertColorInPalette(image.Palette, 5, 5, 4);
            PaletteTest.AssertColorInPalette(image.Palette, 6, 6, 5);
        }