OSDN Git Service

CIEColor.cs
[psychlops/silverlight.git] / dev4 / psychlops / extention / standard / CIEColor.cs
diff --git a/dev4/psychlops/extention/standard/CIEColor.cs b/dev4/psychlops/extention/standard/CIEColor.cs
new file mode 100644 (file)
index 0000000..50df53c
--- /dev/null
@@ -0,0 +1,108 @@
+using System;\r
+\r
+namespace Psychlops\r
+{\r
+       namespace ColorSpaces\r
+       {\r
+               /*\r
+                * CIE 1931\r
+                * R: 700 nm\r
+                * G: 546.1 nm\r
+                * B: 435.8 nm\r
+                * White Point: Illuminant E\r
+                */\r
+               public struct CIERGB\r
+               {\r
+                       public double R, G, B;\r
+\r
+                       public CIEXYZ convertToCIEXYZ()\r
+                       {\r
+                               double[,] b =\r
+                       { \r
+                               { 0.49, 0.31, 0.20 },\r
+                               { 0.17697, 0.81240, 0.01063 },\r
+                               { 0.00, 0.01, 0.99 }\r
+                       };\r
+\r
+                               CIEXYZ v;\r
+\r
+                               v.X = b[0, 0] * R + b[0, 1] * G + b[0, 2] * B;\r
+                               v.Y = b[1, 0] * R + b[1, 1] * G + b[1, 2] * B;\r
+                               v.Z = b[2, 0] * R + b[2, 1] * G + b[2, 2] * B;\r
+\r
+                               return v;\r
+                       }\r
+               }\r
+\r
+               /*\r
+                * CIE 1931\r
+                */\r
+               public struct CIEXYZ\r
+               {\r
+                       public double X, Y, Z;\r
+\r
+                       public CIExyY convertToCIExyY()\r
+                       {\r
+                               CIExyY v;\r
+\r
+                               double denominator = X + Y + Z;\r
+                               v.x = X / denominator;\r
+                               v.y = Y / denominator;\r
+                               v.Y = Y;\r
+\r
+                               return v;\r
+                       }\r
+               }\r
+\r
+               public struct CIExyY\r
+               {\r
+                       public double x, y, Y;\r
+\r
+                       public CIEXYZ convertToCIEXYZ()\r
+                       {\r
+                               CIEXYZ v;\r
+\r
+                               v.X = Y / y * x;\r
+                               v.Y = Y;\r
+                               v.Z = Y / y * (1 - x - y);\r
+\r
+                               return v;\r
+                       }\r
+\r
+                       // Yn = 1.0 when RGB of white point is { 1, 1, 1 }\r
+                       public CIELuv convertToCIELuv(double Yn = 1.0)\r
+                       {\r
+\r
+                               CIELuv v;\r
+\r
+                               double denominator = (-2 * x + 12 * y + 3);\r
+                               double up = 4 * x / denominator;\r
+                               double vp = 9 * y / denominator;\r
+\r
+                               double Yd = Y / Yn;\r
+                               v.L = Yd > System.Math.Pow(6 / 29, 3) ? 116 * System.Math.Pow(Yd, 3) : System.Math.Pow(29 / 3, 3) * Yd;\r
+                               v.u = 13 * v.L * (up - 0.2009);\r
+                               v.v = 13 * v.L * (vp - 0.4610);\r
+\r
+                               return v;\r
+                       }\r
+               }\r
+\r
+               /* L*u*v*\r
+                * CIE 1976\r
+                * standard illuminant C\r
+                */\r
+               public struct CIELuv\r
+               {\r
+                       public double L, u, v;\r
+\r
+               }\r
+\r
+               public struct CIELab\r
+               {\r
+                       public double L, a, b;\r
+\r
+               }\r
+\r
+       }\r
+}
\ No newline at end of file