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 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)); }
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); }
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); }
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 Color3 ToColor3(Color color) { return(new Color3(ColorTransform.RgbToLab(color))); }
public PaletteColorComparer(Color rgb) { this.origin = ColorTransform.RgbToLab(rgb); }
public static double ColorDistance(Color x, Color y) { return(ColorTransform.RgbToLab(x).Distance(ColorTransform.RgbToLab(y))); }
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)); }