コード例 #1
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);
        }
コード例 #2
0
ファイル: RawImage.cs プロジェクト: mdsoftware/Colorissimo
        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));
        }
コード例 #3
0
        private static Color[] LabSort(Color[] colors, Color origin)
        {
            List <LabColor> l = new List <LabColor>(colors.Length);

            for (int i = 0; i < colors.Length; i++)
            {
                l.Add(ColorTransform.RgbToLab(colors[i]));
            }

            l.Sort(new PaletteColorComparer(origin));

            Color[] c = new Color[l.Count];
            for (int i = 0; i < l.Count; i++)
            {
                c[i] = ColorTransform.LabToRgb(l[i]);
            }
            return(c);
        }
コード例 #4
0
ファイル: Sorting.cs プロジェクト: mdsoftware/Colorissimo
        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);
        }
コード例 #5
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());
        }
コード例 #6
0
 public Color3 ToColor3(Color color)
 {
     return(new Color3(ColorTransform.RgbToLab(color)));
 }
コード例 #7
0
 public PaletteColorComparer(Color rgb)
 {
     this.origin = ColorTransform.RgbToLab(rgb);
 }
コード例 #8
0
 public static double ColorDistance(Color x, Color y)
 {
     return(ColorTransform.RgbToLab(x).Distance(ColorTransform.RgbToLab(y)));
 }
コード例 #9
0
ファイル: RawImage.cs プロジェクト: mdsoftware/Colorissimo
        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));
        }