public void HslaColorImplementsEquals()
        {
            HslaColor first  = HslaColor.FromColor(Color.White);
            HslaColor second = HslaColor.FromColor(Color.White);

            first.Equals(second).Should().BeTrue("because the color structure should implement Equals()");
        }
        public void HslaColorShouldConvertToAndFromString(string expected)
        {
            Color     color     = ColorTranslator.FromHtml(expected);
            HslaColor hslaColor = HslaColor.FromColor(color);
            string    result    = ColorTranslator.ToHtml(hslaColor);

            result.Should().Be(expected);
        }
Example #3
0
        /// <summary>
        /// Processes the image.
        /// </summary>
        /// <param name="factory">
        /// The current instance of the <see cref="T:ImageProcessor.ImageFactory"/> class containing
        /// the image to process.
        /// </param>
        /// <returns>
        /// The processed image from the current instance of the <see cref="T:ImageProcessor.ImageFactory"/> class.
        /// </returns>
        public Image ProcessImage(ImageFactory factory)
        {
            Bitmap newImage = null;
            Image  image    = factory.Image;

            try
            {
                Tuple <int, bool> parameters = this.DynamicParameter;
                int  degrees = parameters.Item1;
                bool rotate  = parameters.Item2;
                int  width   = image.Width;
                int  height  = image.Height;

                newImage = new Bitmap(image);

                using (FastBitmap fastBitmap = new FastBitmap(newImage))
                {
                    if (!rotate)
                    {
                        for (int y = 0; y < height; y++)
                        {
                            for (int x = 0; x < width; x++)
                            {
                                HslaColor original = HslaColor.FromColor(fastBitmap.GetPixel(x, y));
                                HslaColor altered  = HslaColor.FromHslaColor(degrees / 360f, original.S, original.L, original.A);
                                fastBitmap.SetPixel(x, y, altered);
                            }
                        }
                    }
                    else
                    {
                        for (int y = 0; y < height; y++)
                        {
                            for (int x = 0; x < width; x++)
                            {
                                HslaColor original = HslaColor.FromColor(fastBitmap.GetPixel(x, y));
                                HslaColor altered  = HslaColor.FromHslaColor((original.H + (degrees / 360f)) % 1, original.S, original.L, original.A);
                                fastBitmap.SetPixel(x, y, altered);
                            }
                        }
                    }
                }

                image.Dispose();
                image = newImage;
            }
            catch (Exception ex)
            {
                if (newImage != null)
                {
                    newImage.Dispose();
                }

                throw new ImageProcessingException("Error processing image with " + this.GetType().Name, ex);
            }

            return(image);
        }
Example #4
0
        /// <summary>
        /// Processes the image.
        /// </summary>
        /// <param name="factory">
        /// The current instance of the <see cref="T:ImageProcessor.ImageFactory"/> class containing
        /// the image to process.
        /// </param>
        /// <returns>
        /// The processed image from the current instance of the <see cref="T:ImageProcessor.ImageFactory"/> class.
        /// </returns>
        public Image ProcessImage(ImageFactory factory)
        {
            var image = factory.Image;

            try
            {
                Tuple <int, bool> parameters = DynamicParameter;
                var degrees = parameters.Item1;

                if (degrees == 0)
                {
                    return(image);
                }

                var rotate = parameters.Item2;
                var width  = image.Width;
                var height = image.Height;
                using (var fastBitmap = new FastBitmap(image))
                {
                    if (!rotate)
                    {
                        for (var y = 0; y < height; y++)
                        {
                            for (var x = 0; x < width; x++)
                            {
                                var original = HslaColor.FromColor(fastBitmap.GetPixel(x, y));
                                var altered  = HslaColor.FromHslaColor(degrees / 360f, original.S, original.L, original.A);
                                fastBitmap.SetPixel(x, y, altered);
                            }
                        }
                    }
                    else
                    {
                        for (var y = 0; y < height; y++)
                        {
                            for (var x = 0; x < width; x++)
                            {
                                var original = HslaColor.FromColor(fastBitmap.GetPixel(x, y));
                                var altered  = HslaColor.FromHslaColor((original.H + (degrees / 360f)) % 1, original.S, original.L, original.A);
                                fastBitmap.SetPixel(x, y, altered);
                            }
                        }
                    }
                }

                return(image);
            }
            catch (Exception ex)
            {
                throw new ImageProcessingException("Error processing image with " + GetType().Name, ex);
            }
        }
Example #5
0
            public void then_should_return_rgba_version_of_hsla_color_given_red()
            {
                // Arrange
                var hslaColor = HslaColor.FromColor(Color.Red);

                // Act
                var rgbaColor = (RgbaColor)hslaColor;

                // Assert
                Assert.That(rgbaColor.R, Is.EqualTo(255));
                Assert.That(rgbaColor.G, Is.EqualTo(0));
                Assert.That(rgbaColor.B, Is.EqualTo(0));
                Assert.That(rgbaColor.A, Is.EqualTo(255));
            }
Example #6
0
            public void then_should_return_cmyk_version_of_hsla_color_given_red()
            {
                // Arrange
                var hslaColor = HslaColor.FromHslaColor(0f, 1f, .5f, 1f);

                // Act
                var cmyk = (CmykColor)hslaColor;

                // Assert
                Assert.That(cmyk.C, Is.EqualTo(0));
                Assert.That(cmyk.M, Is.EqualTo(100));
                Assert.That(cmyk.Y, Is.EqualTo(100));
                Assert.That(cmyk.K, Is.EqualTo(0));
            }
Example #7
0
            public void then_should_return_hsla_version_of_system_drawing_color_given_red()
            {
                // Arrange
                var color = Color.Red;

                // Act
                HslaColor hslaColor = color;

                // Assert
                Assert.That(hslaColor.H, Is.EqualTo(0));
                Assert.That(hslaColor.S, Is.EqualTo(1.0f));
                Assert.That(hslaColor.L, Is.EqualTo(.5f));
                Assert.That(hslaColor.A, Is.EqualTo(1.0f));
            }
        /// <summary>
        /// Calculate a difference measurement between two colors. Weight H, S and L.
        /// </summary>
        /// <returns>The distance.</returns>
        /// <param name="apple">Apple.</param>
        /// <param name="orange">Orange.</param>
        public static float WeightedDistance(HslaColor apple, HslaColor orange)
        {
            var diff_h = HueDifference(apple.H, orange.H);
            var diff_s = apple.S - orange.S;

            diff_s *= diff_s;

            var diff_l = apple.L - orange.L;

            diff_l *= diff_l;

            var distance = 0.5f * diff_h + 0.15f * diff_s + 0.35f * diff_l;

            return(distance);
        }
Example #9
0
        public void BasicExchangeEngineTest()
        {
            // Various H colors.
            var c0 = HslaColor.FromHslaColor(0.0f, 0.5f, 0.5f);
            var c1 = HslaColor.FromHslaColor(0.1f, 0.5f, 0.5f);
            var c3 = HslaColor.FromHslaColor(0.3f, 0.5f, 0.5f);
            var c4 = HslaColor.FromHslaColor(0.4f, 0.5f, 0.5f);
            var c5 = HslaColor.FromHslaColor(0.5f, 0.5f, 0.5f);
            var c9 = HslaColor.FromHslaColor(0.9f, 0.5f, 0.5f);
            var cA = HslaColor.FromHslaColor(1.0f, 0.5f, 0.5f);

            // Fudged S or L
            var c1a = HslaColor.FromHslaColor(0.1f, 0.4f, 0.5f);
            var c1b = HslaColor.FromHslaColor(0.1f, 0.5f, 0.4f);
            var c1c = HslaColor.FromHslaColor(0.1f, 0.6f, 0.5f);
            var c1d = HslaColor.FromHslaColor(0.1f, 0.5f, 0.6f);


            // Argument order irrelevant
            Assert.AreEqual(ColorDistances.SimpleHue(c1, c3), ColorDistances.SimpleHue(c3, c1), 0.00001);
            Assert.AreEqual(ColorDistances.SimpleHue(c1, c4), ColorDistances.SimpleHue(c4, c1), 0.00001);


            // Color is always 0.0 away from itself.
            Assert.AreEqual(0.0f, ColorDistances.SimpleHue(c1, c1), 0.00001);
            Assert.AreEqual(0.0f, ColorDistances.SimpleHue(c4, c4), 0.00001);
            Assert.AreEqual(0.0f, ColorDistances.SimpleHue(c9, c9), 0.00001);


            // Distance same if wrapping around 1.0/0.0.
            Assert.AreEqual(ColorDistances.SimpleHue(c9, c1), ColorDistances.SimpleHue(c1, c3), 0.00001);

            // Max distance (1.0) at 180 from each other.
            Assert.AreEqual(1.0f, ColorDistances.SimpleHue(c4, c9), 0.00001);
            Assert.AreEqual(1.0f, ColorDistances.SimpleHue(c9, c4), 0.00001);

            Assert.AreEqual(1.0f, ColorDistances.SimpleHue(c5, c0), 0.00001);
            Assert.AreEqual(1.0f, ColorDistances.SimpleHue(c5, cA), 0.00001);
            Assert.AreEqual(1.0f, ColorDistances.SimpleHue(c0, c5), 0.00001);
            Assert.AreEqual(1.0f, ColorDistances.SimpleHue(cA, c5), 0.00001);

            var c25 = HslaColor.FromHslaColor(0.25f, 0.5f, 0.5f);
            var c75 = HslaColor.FromHslaColor(0.75f, 0.5f, 0.5f);

            Assert.AreEqual(1.0f, ColorDistances.SimpleHue(c25, c75), 0.00001);
            Assert.AreEqual(1.0f, ColorDistances.SimpleHue(c75, c25), 0.00001);
        }
Example #10
0
        private void UpdatePixelColor(Point pixelPosition, RgbaColor rgbaColor)
        {
            if (this.imageController.IsGrayscale)
            {
                this.rgbGrayColorToolStripStatusLabel.Text = FormattableString.Invariant($"Gray: {rgbaColor.R}");
                this.hsvColorToolStripStatusLabel.Text     = string.Empty;
            }
            else
            {
                this.rgbGrayColorToolStripStatusLabel.Text = rgbaColor.ToString();

                HslaColor hslaColor = rgbaColor;

                this.hsvColorToolStripStatusLabel.Text = hslaColor.ToString();
            }

            this.UpdateStatusStripSeparators();
        }
        /// <summary>
        /// Simples color difference, returns higher numbers for higher difference in hue.
        /// </summary>
        /// <returns>Some sort of distance metric. 0.0 = identical, 1.0 = completely different.</returns>
        /// <param name="apple">One color.</param>
        /// <param name="orange">Another color.</param>
        public static float SimpleHue(HslaColor apple, HslaColor orange)
        {
            var toreturn = HueDifference(apple.H, orange.H);

            return(toreturn);
        }