コード例 #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="l"></param>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <param name="Illuminant"></param>
        /// <returns></returns>
        public static Rgba ToRgba(double l, double a, double b, Illuminant Illuminant = Illuminant.Default)
        {
            double theta = 6.0 / 29.0;

            double fy = (l + 16.0) / 116.0;
            double fx = fy + (a / 500.0);
            double fz = fy - (b / 200.0);

            var mx = Xyz.Max[Xyz.Component.X, Illuminant];
            var my = Xyz.Max[Xyz.Component.Y, Illuminant];
            var mz = Xyz.Max[Xyz.Component.Z, Illuminant];

            var x = (fx > theta ? mx * (fx * fx * fx) : (fx - 16.0 / 116.0) * 3.0 * (theta * theta) * mx).Coerce(mx);
            var y = (fy > theta ? my * (fy * fy * fy) : (fy - 16.0 / 116.0) * 3.0 * (theta * theta) * my).Coerce(my);
            var z = (fz > theta ? mz * (fz * fz * fz) : (fz - 16.0 / 116.0) * 3.0 * (theta * theta) * mz).Coerce(mz);

            double[] Clinear = new double[3];
            Clinear[0] = x * 3.2410 - y * 1.5374 - z * 0.4986;  //R
            Clinear[1] = -x * 0.9692 + y * 1.8760 - z * 0.0416; //G
            Clinear[2] = x * 0.0556 - y * 0.2040 + z * 1.0570;  //B

            for (int i = 0; i < 3; i++)
            {
                Clinear[i]  = (Clinear[i] <= 0.0031308) ? 12.92 * Clinear[i] : (1.0 + 0.055) * Math.Pow(Clinear[i], (1.0 / 2.4)) - 0.055;
                Clinear[i]  = Math.Min(Clinear[i], 1);
                Clinear[i]  = Math.Max(Clinear[i], 0);
                Clinear[i] *= 255.0;
                Clinear[i]  = Clinear[i].Coerce(255.0);
            }

            return(new Rgba(Clinear[0].ToInt32(), Clinear[1].ToInt32(), Clinear[2].ToInt32()));
        }
コード例 #2
0
 public RgbWorkingSpace(string name, Illuminant refwhite, double[,] xyz_to_rgb, double[,] rgb_to_xyz)
 {
     this.Name           = name;
     this.ReferenceWhite = refwhite;
     this.XyztoRgbMatrix = xyz_to_rgb;
     this.RgbtoxyzMatrix = rgb_to_xyz;
 }
コード例 #3
0
 public RGBWorkingSpace(string name, Illuminant refwhite, double[,] xyz_to_rgb, double[,] rgb_to_xyz)
 {
     this.Name           = name;
     this.ReferenceWhite = refwhite;
     this.XYZToRGBMatrix = xyz_to_rgb;
     this.RGBTOXYZMatrix = rgb_to_xyz;
 }
コード例 #4
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;
        }
        public static void Initialize(KnownIlluminant sourceIlluminant, KnownIlluminant destIlluminant, ChromaticAdaptionMethod method = ChromaticAdaptionMethod.BradFord)
        {
            Illuminant src  = Illuminant.GetIlluminant(sourceIlluminant);
            Illuminant dest = Illuminant.GetIlluminant(destIlluminant);

            GetCATMatrix(src, dest, method);
        }
コード例 #6
0
ファイル: ColorSpaceView.cs プロジェクト: heniu75/Imagin.NET
 /// <summary>
 ///
 /// </summary>
 /// <param name="Value"></param>
 protected virtual void OnIlluminantChanged(Illuminant Value)
 {
     if (ColorSpace != null)
     {
         ColorSpace.Illuminant = Value;
     }
 }
 public static void GetCATMatrix(Illuminant source, Illuminant dest, ChromaticAdaptionMethod method = ChromaticAdaptionMethod.BradFord)
 {
     GetMatrix(method, ref Ma, ref MaPrime);
     double[] prb_source = Matrix.Dot(Ma, source.GetXYZ());
     double[] prb_dest   = Matrix.Dot(Ma, dest.GetXYZ());
     double[,] prb = Matrix.Diagonal(3, Elementwise.Divide(prb_dest, prb_source));
     M             = Matrix.Dot(Matrix.Dot(MaPrime, prb), Ma);
 }
コード例 #8
0
ファイル: Xyz.cs プロジェクト: heniu75/Imagin.NET
        /// <summary>
        /// Creates an instance of the <see cref="Xyz"/> structure.
        /// </summary>
        /// <param name="X"></param>
        /// <param name="Y"></param>
        /// <param name="Z"></param>
        /// <param name="Illuminant"></param>
        public Xyz(double X, double Y, double Z, Illuminant Illuminant = Illuminant.Default)
        {
            illuminant = Illuminant;

            x = X.Coerce(Max[Component.X, Illuminant], MinValue.X);
            y = Y.Coerce(Max[Component.Y, Illuminant], MinValue.Y);
            z = Z.Coerce(Max[Component.Z, Illuminant], MinValue.Z);
        }
コード例 #9
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;
        }
コード例 #10
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;
        }
コード例 #11
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;
        }
コード例 #12
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;
        }
コード例 #13
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;
        }
コード例 #14
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));
        }
コード例 #15
0
ファイル: Luv.cs プロジェクト: heniu75/Imagin.NET
        /// <summary>
        ///
        /// </summary>
        /// <param name="L"></param>
        /// <param name="U"></param>
        /// <param name="V"></param>
        /// <param name="Illuminant"></param>
        /// <returns></returns>
        public static Xyz ToXyz(double L, double U, double V, Illuminant Illuminant = Illuminant.Default)
        {
            var y = (L + 16.0) / 116.0;

            y = Math.Pow(y, 3.0) > 0.008856 ? Math.Pow(y, 3) : (y - 16.0 / 116) / 7.787;

            var mx = Xyz.Max[Xyz.Component.X, Illuminant];
            var my = Xyz.Max[Xyz.Component.Y, Illuminant];
            var mz = Xyz.Max[Xyz.Component.Z, Illuminant];

            var rl = mx.Shift(2) + (15.0 * my.Shift(2)) + (3.0 + mz.Shift(2));
            var ru = (4.0 * mx.Shift(2)) / rl;
            var rv = (9.0 * my.Shift(2)) / rl;

            var u = U / (13.0 * L) + ru;
            var v = V / (13.0 * L) + rv;

            y *= 100.0;
            var x = -(9.0 * y * u) / ((u - 4.0) * v - u * v);
            var z = (9 * y - (15.0 * v * y) - (v * x)) / (3.0 * v);

            return(new Xyz(x, y, z));
        }
コード例 #16
0
ファイル: Luv.cs プロジェクト: heniu75/Imagin.NET
        /// <summary>
        ///
        /// </summary>
        /// <param name="X"></param>
        /// <param name="Y"></param>
        /// <param name="Z"></param>
        /// <param name="Illuminant"></param>
        /// <returns></returns>
        public static Luv FromXyz(double X, double Y, double Z, Illuminant Illuminant = Illuminant.Default)
        {
            var w = X + (15d * Y) + (3d * Z);
            var u = (4d * X) / w;
            var v = (9d * Y) / w;

            var y = Y > 0.008856 ? Math.Pow(Y, 1d / 3d) : (7.787 * Y) + (16d / 116d);

            var mx = Xyz.Max[Xyz.Component.X, Illuminant];
            var my = Xyz.Max[Xyz.Component.Y, Illuminant];
            var mz = Xyz.Max[Xyz.Component.Z, Illuminant];

            var rl = mx.Shift(2) + (15.0 * my.Shift(2)) + (3.0 * mz.Shift(2));
            var ru = (4.0 * mx.Shift(2)) / rl;
            var rv = (9.0 * my.Shift(2)) / rl;

            var l = (116d * y) - 16d;

            u = 13d * l * (u - ru);
            v = 13d * l * (v - rv);

            return(new Luv(l.Divide(MaxValue.L), u.Divide(MaxValue.U), v.Divide(MaxValue.V)));
        }
コード例 #17
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="R"></param>
        /// <param name="G"></param>
        /// <param name="B"></param>
        /// <param name="A"></param>
        /// <returns></returns>
        public static Lab FromRgba(byte R, byte G, byte B, byte A = 255, Illuminant Illuminant = Illuminant.Default)
        {
            var RLinear = R.ToDouble() / 255d;
            var GLinear = G.ToDouble() / 255d;
            var BLinear = 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, Illuminant];
            var my = Xyz.Max[Xyz.Component.Y, Illuminant];
            var mz = Xyz.Max[Xyz.Component.Z, Illuminant];

            double l = 116d * Xyz.Fxyz(y / my) - 16d;
            double a = 500d * (Xyz.Fxyz(x / mx) - Xyz.Fxyz(y / my));
            double b = 200d * (Xyz.Fxyz(y / my) - Xyz.Fxyz(z / mz));

            return(new Lab(l, a, b));
        }
コード例 #18
0
ファイル: Xyz.cs プロジェクト: heniu75/Imagin.NET
            /// <summary>
            ///
            /// </summary>
            /// <param name="Component"></param>
            /// <param name="Illuminant"></param>
            /// <returns></returns>
            public double this[Component Component, 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);
                }
            }
 public static void Initialize(Illuminant sourceIlluminant, Illuminant destIlluminant, ChromaticAdaptionMethod method = ChromaticAdaptionMethod.BradFord)
 {
     GetCATMatrix(sourceIlluminant, destIlluminant, method);
 }
コード例 #20
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)
 {
 }
コード例 #21
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)
 {
 }
        private void cbBoxFrom_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            KnownIlluminant src = (KnownIlluminant)cbBoxFrom.SelectedIndex;

            SourceIlluminant = Illuminant.GetIlluminant(src);
        }
コード例 #23
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="Value"></param>
 protected virtual void OnIlluminantChanged(Illuminant Value)
 {
     UpdatePlane(SelectedComponent.GetValue(Color).Round().ToInt32());
     SelectedComponent.UpdateSlider(NormalPane, Color);
 }
        private void cbBoxTo_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            KnownIlluminant dest = (KnownIlluminant)cbBoxTo.SelectedIndex;

            DestIlluminant = Illuminant.GetIlluminant(dest);
        }
 public static double[] CATTransform <T>(T[] inputValue, Illuminant source, Illuminant dest, ChromaticAdaptionMethod method = ChromaticAdaptionMethod.BradFord)
 {
     Initialize(source, dest, method);
     return(CATTransform(inputValue));
 }
コード例 #26
0
        public static Chromacity IlluminantToWhitePoint(Illuminant i)
        {
            switch (i)
            {
            case Illuminant.A:
                return(new Chromacity {
                    X = 0.44757f, Y = 0.40744f
                });

            case Illuminant.B:
                return(new Chromacity {
                    X = 0.34840f, Y = 0.35160f
                });

            case Illuminant.C:
                return(new Chromacity {
                    X = 0.31006f, Y = 0.31615f
                });

            case Illuminant.D50:
                return(new Chromacity {
                    X = 0.34567f, Y = 0.35850f
                });

            case Illuminant.D55:
                return(new Chromacity {
                    X = 0.33242f, Y = 0.34743f
                });

            case Illuminant.D65:
                return(new Chromacity {
                    X = 0.31273f, Y = 0.32902f
                });

            case Illuminant.D75:
                return(new Chromacity {
                    X = 0.29902f, Y = 0.31485f
                });

            case Illuminant.I9300K:
                return(new Chromacity {
                    X = 0.28480f, Y = 0.29320f
                });

            case Illuminant.E:
                return(new Chromacity {
                    X = 0.33333f, Y = 0.33333f
                });

            case Illuminant.F2:
                return(new Chromacity {
                    X = 0.37207f, Y = 0.37512f
                });

            case Illuminant.F7:
                return(new Chromacity {
                    X = 0.31285f, Y = 0.32918f
                });

            case Illuminant.F11:
                return(new Chromacity {
                    X = 0.38054f, Y = 0.37691f
                });
            }

            return(new Chromacity {
                X = 0.31273f, Y = 0.32902f
            });
        }
コード例 #27
0
        protected PixelDouble ReadPixs(Illuminant i, Register r, FileType f, Area a)
        {
            string filename = "current_dir" + IllDic[i] + RegDic[r] + FileDic[f];

            return(AreaDic[a](PixelStream.ReadTxtDouble(filename, 1408, 1032)));
        }
コード例 #28
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;
        }