From 0468ac6e38f282d5005e72763b7640995aaeae62 Mon Sep 17 00:00:00 2001 From: Damiaan Date: Tue, 15 Dec 2015 23:46:32 +0100 Subject: [PATCH] CieXyz color space: add transform CieXyzToColor Former-commit-id: e596ceb45d6865499a639cf69302a6e493a68d43 Former-commit-id: 489871ee81e15cb14b8a9abf4a2de3edbf479aa4 Former-commit-id: 3f99cab909be147d8de52b98eddb016ccdbc08ff --- src/ImageProcessor/Colors/ColorTransforms.cs | 25 +++++++++++++++++++ .../Colors/ColorConversionTests.cs | 16 ++++++++++++ 2 files changed, 41 insertions(+) diff --git a/src/ImageProcessor/Colors/ColorTransforms.cs b/src/ImageProcessor/Colors/ColorTransforms.cs index 5c7dc99ef8..255b2c2b0b 100644 --- a/src/ImageProcessor/Colors/ColorTransforms.cs +++ b/src/ImageProcessor/Colors/ColorTransforms.cs @@ -67,6 +67,31 @@ namespace ImageProcessor return new Color(r, g, b); } + public static implicit operator Color(CieXyz color) + { + var x = color.X; + var y = color.Y; + var z = color.Z; + + // assume sRGB + // http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html + float r = (x * 3.240969941904521F) + (y * -1.537383177570093F) + (z * -0.498610760293F); + float g = (x * -0.96924363628087F) + (y * 1.87596750150772F) + (z * 0.041555057407175F); + float b = (x * 0.055630079696993F) + (y * -0.20397695888897F) + (z * 1.056971514242878F); + + r = r > 0.0031308 ? (float)((1.055 * Math.Pow(r, 1.0 / 2.4)) - 0.055) : r = (r * 12.92F); + + g = g > 0.0031308 ? (float)((1.055 * Math.Pow(g, 1.0 / 2.4)) - 0.055) : g = (g * 12.92F); + + b = b > 0.0031308 ? (float)((1.055 * Math.Pow(b, 1.0 / 2.4)) - 0.055) : b = (b * 12.92F); + + r = Math.Min(Math.Max(0, r), 1); + g = Math.Min(Math.Max(0, g), 1); + b = Math.Min(Math.Max(0, b), 1); + + return new Color(r, g, b); + } + /// /// Allows the implicit conversion of an instance of to a /// . diff --git a/tests/ImageProcessor.Tests/Colors/ColorConversionTests.cs b/tests/ImageProcessor.Tests/Colors/ColorConversionTests.cs index efbab03a51..0d9c16aa79 100644 --- a/tests/ImageProcessor.Tests/Colors/ColorConversionTests.cs +++ b/tests/ImageProcessor.Tests/Colors/ColorConversionTests.cs @@ -103,6 +103,22 @@ namespace ImageProcessor.Tests } + [Fact] + public void CieXyzToColor() + { + CieXyz cieXyz = new CieXyz(0.25F, 0.40F, 0.10F); + Color color = cieXyz; + + Assert.Equal(0.4174F, color.R, 3); + Assert.Equal(0.7434F, color.G, 3); + Assert.Equal(0.2162F, color.B, 2); + + //xyz2rgb([0.25 0.40 0.10]) + //ans = 0.4174 0.7434 0.2152 + + + } + /// /// Tests the implicit conversion from to . ///