예제 #1
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="Value"></param>
 protected virtual void OnObserverChanged(ObserverAngle Value)
 {
     if (ColorSpace != null)
     {
         ColorSpace.Observer = Value;
     }
 }
예제 #2
0
파일: Luv.cs 프로젝트: heniu75/Imagin.NET
        /// <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;
        }
예제 #3
0
파일: Luv.cs 프로젝트: heniu75/Imagin.NET
        /// <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;
        }
예제 #4
0
파일: Lch.cs 프로젝트: heniu75/Imagin.NET
        /// <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;
        }
예제 #5
0
파일: Lab.cs 프로젝트: heniu75/Imagin.NET
        /// <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;
        }
예제 #6
0
        /// <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;
        }
예제 #7
0
        /// <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;
        }
예제 #8
0
파일: Lch.cs 프로젝트: heniu75/Imagin.NET
        /// <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;
        }
예제 #9
0
파일: Lab.cs 프로젝트: heniu75/Imagin.NET
        /// <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));
        }
예제 #10
0
파일: Luv.cs 프로젝트: heniu75/Imagin.NET
 /// <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)
 {
 }
예제 #11
0
파일: Luv.cs 프로젝트: heniu75/Imagin.NET
 /// <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)
 {
 }
예제 #12
0
            /// <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);
                }
            }