/// <summary> /// /// </summary> /// <param name="Value"></param> protected virtual void OnObserverChanged(ObserverAngle Value) { if (ColorSpace != null) { ColorSpace.Observer = Value; } }
/// <summary> /// /// </summary> /// <param name="Xyz"></param> /// <param name="Observer"></param> /// <param name="Illuminant"></param> public Luv(Xyz Xyz, ObserverAngle Observer = ObserverAngle.Two, Illuminant Illuminant = Illuminant.Default) : this(0, 0, 0, Observer, Illuminant) { var w = Xyz.X + (15d * Xyz.Y) + (3d * Xyz.Z); var u = (4d * Xyz.X) / w; var v = (9d * Xyz.Y) / w; var y = Xyz.Y / 100d; y = Xyz.Y > 0.008856 ? Math.Pow(Xyz.Y, 1d / 3d) : (7.787 * Xyz.Y) + (16d / 116d); var mx = Xyz.Max[Xyz.Component.X, Observer, Illuminant].Shift(2); var my = Xyz.Max[Xyz.Component.Y, Observer, Illuminant].Shift(2); var mz = Xyz.Max[Xyz.Component.Z, Observer, Illuminant].Shift(2); var rl = mx + (15d * my) + (3d * mz); var ru = (4d * mx) / rl; var rv = (9d * my) / rl; var l = (116d * y) - 16d; u = 13d * l * (u - ru); v = 13d * l * (v - rv); L = l; U = u; V = v; }
/// <summary> /// Initializes a new instance of the <see cref="Luv"/> structure. /// </summary> /// <param name="l"></param> /// <param name="u"></param> /// <param name="v"></param> /// <param name="observer"></param> /// <param name="illuminant"></param> public Luv(double l, double u, double v, ObserverAngle observer = ObserverAngle.Two, Illuminant illuminant = Illuminant.Default) : this() { Observer = observer; Illuminant = illuminant; L = l; U = u; V = v; }
/// <summary> /// Initializes a new instance of the <see cref="Lch"/> structure. /// </summary> /// <param name="l"></param> /// <param name="c"></param> /// <param name="h"></param> /// <param name="observer"></param> /// <param name="illuminant"></param> public Lch(double l, double c, double h, ObserverAngle observer = ObserverAngle.Two, Illuminant illuminant = Illuminant.Default) : this() { Observer = observer; Illuminant = illuminant; L = l; C = c; H = h; }
/// <summary> /// Initializes a new instance of the <see cref="Lab"/> structure. /// </summary> /// <param name="l"></param> /// <param name="a"></param> /// <param name="b"></param> /// <param name="observer"></param> /// <param name="illuminant"></param> public Lab(double l, double a, double b, ObserverAngle observer = ObserverAngle.Two, Illuminant illuminant = Illuminant.Default) : this() { Observer = Observer; Illuminant = Illuminant; L = l; A = a; B = b; }
/// <summary> /// Initializes a new instance of the <see cref="Xyz"/> structure. /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <param name="z"></param> /// <param name="observer"></param> /// <param name="illuminant"></param> public Xyz(double x, double y, double z, ObserverAngle observer = ObserverAngle.Two, Illuminant illuminant = Illuminant.Default) : this() { Observer = observer; Illuminant = illuminant; X = x; Y = y; Z = z; }
/// <summary> /// /// </summary> /// <param name="Rgba"></param> /// <param name="Observer"></param> /// <param name="Illuminant"></param> public Xyz(Rgba Rgba, ObserverAngle Observer = ObserverAngle.Two, Illuminant Illuminant = Illuminant.Default) : this(0, 0, 0, Observer, Illuminant) { var Rgb = new double[3]; Rgb[0] = Rgba.Linear(Rgba.R); Rgb[1] = Rgba.Linear(Rgba.G); Rgb[2] = Rgba.Linear(Rgba.B); for (int i = 0; i < 3; i++) { Rgb[i] = Rgb[i] > 0.04045 ? Math.Pow((Rgb[i] + 0.055) / 1.055, 2.4) : Rgb[i] / 12.92; } X = Rgb[0] * 0.4124 + Rgb[1] * 0.3576 + Rgb[2] * 0.1805; Y = Rgb[0] * 0.2126 + Rgb[1] * 0.7152 + Rgb[2] * 0.0722; Z = Rgb[0] * 0.0193 + Rgb[1] * 0.1192 + Rgb[2] * 0.9505; }
/// <summary> /// /// </summary> /// <param name="Lab"></param> /// <param name="Observer"></param> /// <param name="Illuminant"></param> public Lch(Lab Lab, ObserverAngle Observer = ObserverAngle.Two, Illuminant Illuminant = Illuminant.Default) : this(0, 0, 0, Observer, Illuminant) { double l, c, h = Math.Atan2(Lab.B, Lab.A); if (h > 0d) { h = (h / Math.PI) * 180d; } else { h = 360d - (h.Abs() / Math.PI) * 180d; } l = Lab.L; c = Math.Sqrt(Math.Pow(Lab.A, 2d) + Math.Pow(Lab.B, 2d)); L = l; C = c; H = h; }
/// <summary> /// /// </summary> /// <param name="Rgba"></param> /// <param name="Observer"></param> /// <param name="Illuminant"></param> public Lab(Rgba Rgba, ObserverAngle Observer = ObserverAngle.Two, Illuminant Illuminant = Illuminant.Default) : this(0, 0, 0, Observer, Illuminant) { var RLinear = Rgba.R.ToDouble() / 255d; var GLinear = Rgba.G.ToDouble() / 255d; var BLinear = Rgba.B.ToDouble() / 255d; RLinear = (RLinear > 0.04045) ? Math.Pow((RLinear + 0.055) / (1 + 0.055), 2.2) : (RLinear / 12.92); GLinear = (GLinear > 0.04045) ? Math.Pow((GLinear + 0.055) / (1 + 0.055), 2.2) : (GLinear / 12.92); BLinear = (BLinear > 0.04045) ? Math.Pow((BLinear + 0.055) / (1 + 0.055), 2.2) : (BLinear / 12.92); double x = RLinear * 0.4124 + GLinear * 0.3576 + BLinear * 0.1805; double y = RLinear * 0.2126 + GLinear * 0.7152 + BLinear * 0.0722; double z = RLinear * 0.0193 + GLinear * 0.1192 + BLinear * 0.9505; var mx = Xyz.Max[Xyz.Component.X, Observer, Illuminant]; var my = Xyz.Max[Xyz.Component.Y, Observer, Illuminant]; var mz = Xyz.Max[Xyz.Component.Z, Observer, Illuminant]; L = 116d * Xyz.Fxyz(y / my) - 16d; A = 500d * (Xyz.Fxyz(x / mx) - Xyz.Fxyz(y / my)); B = 200d * (Xyz.Fxyz(y / my) - Xyz.Fxyz(z / mz)); }
/// <summary> /// /// </summary> /// <param name="Rgba"></param> /// <param name="Observer"></param> /// <param name="Illuminant"></param> public Luv(Rgba Rgba, ObserverAngle Observer = ObserverAngle.Two, Illuminant Illuminant = Illuminant.Default) : this(new Xyz(Rgba), Observer, Illuminant) { }
/// <summary> /// /// </summary> /// <param name="Color"></param> /// <param name="Observer"></param> /// <param name="Illuminant"></param> public Luv(Color Color, ObserverAngle Observer = ObserverAngle.Two, Illuminant Illuminant = Illuminant.Default) : this(new Rgba(Color), Observer, Illuminant) { }
/// <summary> /// /// </summary> /// <param name="Component"></param> /// <param name="Illuminant"></param> /// <returns></returns> public double this[Component Component, ObserverAngle Observer, Illuminant Illuminant] { get { switch (Illuminant) { case Illuminant.A: switch (Component) { case Component.X: return(1.0985); case Component.Y: return(1d); case Component.Z: return(0.3558); } break; case Illuminant.C: switch (Component) { case Component.X: return(0.9807); case Component.Y: return(1d); case Component.Z: return(1.1822); } break; case Illuminant.E: switch (Component) { case Component.X: return(1d); case Component.Y: return(1d); case Component.Z: return(1d); } break; case Illuminant.D50: switch (Component) { case Component.X: return(0.9642); case Component.Y: return(1d); case Component.Z: return(0.8251); } break; case Illuminant.D55: switch (Component) { case Component.X: return(0.9568); case Component.Y: return(1d); case Component.Z: return(0.9214); } break; case Illuminant.ICC: switch (Component) { case Component.X: return(0.962); case Component.Y: return(1d); case Component.Z: return(0.8249); } break; case Illuminant.D65: default: switch (Component) { case Component.X: return(0.95047); case Component.Y: return(1d); case Component.Z: return(1.08883); } break; } return(0d); } }