Exemple #1
0
 public Color3(LabColor color)
 {
     this.A     = color.L;
     this.B     = color.A;
     this.C     = color.B;
     this.Count = 1;
 }
        public static double diff(Color color1, Color color2)
        {
            LabColor lab1 = LabColorTransform.RgbToLab(color1);
            LabColor lab2 = LabColorTransform.RgbToLab(color2);

            return(Math.Sqrt((lab2.L - lab1.L) * (lab2.L - lab1.L) + (lab2.A - lab1.A) * (lab2.A - lab1.A) + (lab2.B - lab1.B) * (lab2.B - lab1.B)));
        }
Exemple #3
0
        public int AddColor(Color color)
        {
            int      rgb = (color.ToArgb() & 0xffffff);
            LabColor lab = ColorTransform.RgbToLab(color);

            using (SqlConnection conn = this.GetConnection())
            {
                SqlCommand cmd = new SqlCommand("UP_ADD_COLOR", conn);
                cmd.CommandType = System.Data.CommandType.StoredProcedure;

                cmd.Parameters.Add("@rgb", System.Data.SqlDbType.Int).Value    = rgb;
                cmd.Parameters.Add("@l", System.Data.SqlDbType.Float).Value    = Math.Round(lab.L, 6);
                cmd.Parameters.Add("@a", System.Data.SqlDbType.Float).Value    = Math.Round(lab.A, 6);
                cmd.Parameters.Add("@b", System.Data.SqlDbType.Float).Value    = Math.Round(lab.B, 6);
                cmd.Parameters.Add("@l_hash", System.Data.SqlDbType.Int).Value = lab.HashL;
                cmd.Parameters.Add("@a_hash", System.Data.SqlDbType.Int).Value = lab.HashA;
                cmd.Parameters.Add("@b_hash", System.Data.SqlDbType.Int).Value = lab.HashB;

                cmd.ExecuteNonQuery();

                cmd = null;
            }

            return(rgb);
        }
        public static XyzColor LabToXyz(LabColor lab)
        {
            double var_Y = (lab.L + 16f) / 116f;
            double var_X = lab.A / 500f + var_Y;
            double var_Z = var_Y - lab.B / 200f;

            if (Math.Pow(var_Y, 3f) > 0.008856f)
            {
                var_Y = Math.Pow(var_Y, 3f);
            }
            else
            {
                var_Y = (var_Y - 16f / 116f) / 7.787f;
            }
            if (Math.Pow(var_X, 3f) > 0.008856f)
            {
                var_X = Math.Pow(var_X, 3f);
            }
            else
            {
                var_X = (var_X - 16f / 116f) / 7.787f;
            }
            if (Math.Pow(var_Z, 3f) > 0.008856f)
            {
                var_Z = Math.Pow(var_Z, 3f);
            }
            else
            {
                var_Z = (var_Z - 16f / 116f) / 7.787f;
            }

            return(new XyzColor(ref_X * var_X,   //ref_X =  95.047     Observer= 2°, Illuminant= D65
                                ref_Y * var_Y,   //ref_Y = 100.000
                                ref_Z * var_Z)); //ref_Z = 108.883
        }
Exemple #5
0
        public double Distance(LabColor x)
        {
            float l = this.L - x.L;
            float a = this.A - x.A;
            float b = this.B - x.B;

            return(Math.Sqrt((l * l) + (a * a) + (b * b)));
        }
Exemple #6
0
        public RawImage Resample(int factor)
        {
            switch (factor)
            {
            case 2:
            case 3:
            case 4:
                break;

            default:
                throw new ArgumentException("Invalid resample factor");
            }

            int w = this.Width / factor;
            int h = this.Height / factor;

            int[] dest = new int[w * h];

            int p = 0;

            int[]  pp = new int[4];
            double l;
            double a;
            double b;

            for (int i = 0; i < h; i++)
            {
                int x = (i * factor) * this.Width;
                for (int k = 0; k < factor; k++)
                {
                    pp[k] = x;
                    x    += this.Width;
                }
                for (int j = 0; j < w; j++)
                {
                    int count = 0;
                    l = a = b = 0f;
                    for (int k = 0; k < factor; k++)
                    {
                        for (int m = 0; m < factor; m++)
                        {
                            LabColor lab = ColorTransform.RgbToLab(Color.FromArgb(this.Pixels[pp[k]]));
                            l += lab.L;
                            a += lab.A;
                            b += lab.B;
                            pp[k]++;
                            ++count;
                        }
                    }

                    dest[p++] = ColorTransform.LabToRgb(new LabColor(
                                                            l / (double)count,
                                                            a / (double)count,
                                                            b / (double)count)).ToArgb() & 0xffffff;
                }
            }
            return(new RawImage(w, h, dest));
        }
Exemple #7
0
        private static ClusteringPoint ToPoint(Color[] colors)
        {
            ClusteringPoint cp = new ClusteringPoint(24);
            int             i  = 0;

            for (int j = 0; j < colors.Length; j++)
            {
                LabColor lc = ColorTransform.RgbToLab(colors[j]);
                cp[i++] = lc.L;
                cp[i++] = lc.A;
                cp[i++] = lc.B;
                if (i >= cp.Size)
                {
                    break;
                }
            }
            return(cp);
        }
Exemple #8
0
        private static string ColorSearchSql(int color, ColorSearchWidth width, out LabColor lab)
        {
            lab = ColorTransform.RgbToLab(PaletteManager.ColorFromInt(color));

            StringBuilder sb = new StringBuilder();

            int w = (int)width;

            sb.Append(@"SELECT c.RGB, c.L, c.A, c.B
FROM COLOR c, COLOR_INDEX_L l, COLOR_INDEX_A a, COLOR_INDEX_B b
WHERE (l.RGB = c.RGB) AND (a.RGB = c.RGB) AND (b.RGB = l.RGB)");

            sb.Append("AND (l.[HASH] ");
            int h = lab.HashL;

            if (w > 0)
            {
                sb.Append("IN (");

                int c = 0;
                for (int i = -w; i <= w; i++)
                {
                    if (c++ > 0)
                    {
                        sb.Append(',');
                    }
                    sb.Append((h + i).ToString());
                }

                sb.Append(')');
            }
            else
            {
                sb.Append("= ");
                sb.Append(h.ToString());
            }
            sb.Append(')');

            sb.Append(" AND (a.[HASH] ");
            h = lab.HashA;
            if (w > 0)
            {
                sb.Append("IN (");
                int c = 0;
                for (int i = -w; i <= w; i++)
                {
                    if (c++ > 0)
                    {
                        sb.Append(',');
                    }
                    sb.Append((h + i).ToString());
                }

                sb.Append(')');
            }
            else
            {
                sb.Append("= ");
                sb.Append(h.ToString());
            }
            sb.Append(')');

            sb.Append(" AND (b.[HASH] ");
            h = lab.HashB;
            if (w > 0)
            {
                sb.Append("IN (");
                int c = 0;
                for (int i = -w; i <= w; i++)
                {
                    if (c++ > 0)
                    {
                        sb.Append(',');
                    }
                    sb.Append((h + i).ToString());
                }

                sb.Append(')');
            }
            else
            {
                sb.Append("= ");
                sb.Append(h.ToString());
            }
            sb.Append(')');

            return(sb.ToString());
        }
 public static Color LabToRgb(LabColor lab)
 {
     return(LabColorTransform.LabToRgb(lab));
 }
 public static XyzColor LabToXyz(LabColor lab)
 {
     return(LabColorTransform.LabToXyz(lab));
 }
Exemple #11
0
        public RawImage ResizeTo(int maxDimension)
        {
            if ((this.Width <= maxDimension) && (this.Height <= maxDimension))
            {
                return(this);
            }

            double scaleX = (double)this.Width / (double)maxDimension;
            double scaleY = (double)this.Height / (double)maxDimension;

            scaleX = scaleX > scaleY ? scaleX : scaleY;

            int w = (int)((double)this.Width / scaleX);
            int h = (int)((double)this.Height / scaleX);

            scaleX = (double)this.Width / (double)(w + 1);
            int[] mapX = new int[w + 1];
            for (int i = 0; i <= w; i++)
            {
                mapX[i] = (int)(scaleX * (double)i);
            }
            mapX[w] = this.Width;

            scaleY = (double)this.Height / (double)(h + 1);
            int[] mapY = new int[h + 1];
            for (int i = 0; i <= h; i++)
            {
                mapY[i] = (int)(scaleY * (double)i);
            }
            mapY[h] = this.Height;

            int    p = 0;
            double l;
            double a;
            double b;

            int[] dest = new int[w * h];

            for (int i = 0; i < h; i++)
            {
                int y0 = mapY[i];
                int y1 = mapY[i + 1];
                for (int j = 0; j < w; j++)
                {
                    int x0    = mapX[j];
                    int x1    = mapX[j + 1];
                    int count = 0;
                    l = a = b = 0f;

                    for (int ii = y0; ii < y1; ii++)
                    {
                        for (int jj = x0; jj < x1; jj++)
                        {
                            int      c   = this.Pixels[(ii * this.Width) + jj];
                            LabColor lab = ColorTransform.RgbToLab(Color.FromArgb(c));
                            l += lab.L;
                            a += lab.A;
                            b += lab.B;
                            ++count;
                        }
                    }

                    if (count > 0)
                    {
                        dest[p] = ColorTransform.LabToRgb(new LabColor(
                                                              l / (double)count,
                                                              a / (double)count,
                                                              b / (double)count)).ToArgb() & 0xffffff;
                    }
                    ++p;
                }
            }

            return(new RawImage(w, h, dest));
        }
 public static Color LabToRgb(LabColor lab)
 {
     return(ColorTransform.XyzToRgb(ColorTransform.LabToXyz(lab)));
 }