/// <summary> Override <see cref="PaletteBase.GetSliderBrush"/>. </summary> public override GradientStopCollection GetSliderBrush(HSV HSV) { byte A = HSV.A; float H = HSV.H; float S = HSV.S; float L = HSV.V; return(new GradientStopCollection() { new GradientStop() { Offset = 0, Color = HSV.HSVtoRGB(A, H, 0.0f, L) }, new GradientStop() { Offset = 1, Color = HSV.HSVtoRGB(A, H, 100.0f, L) }, }); }
/// <summary> Override <see cref="PalettePicker.GetSliderBrush"/>. </summary> public override GradientStopCollection GetSliderBrush(HSV hsv) { byte A = HSV.A; float H = HSV.H; float S = HSV.S; float V = HSV.V; return(new GradientStopCollection() { new GradientStop() { Offset = 0.0f, Color = HSV.HSVtoRGB(A, H, S, 0) }, new GradientStop() { Offset = 1.0f, Color = HSV.HSVtoRGB(A, H, S, 100) }, }); }
/// <summary> Override <see cref="PaletteBase.Draw"/>. </summary> public override void Draw(CanvasControl sender, CanvasDrawingSession ds, HSV hsv, Vector2 Center, float squareHalfWidth, float squareHalfHeight) { //Palette Rect rect = new Rect(Center.X - squareHalfWidth, Center.Y - squareHalfHeight, squareHalfWidth * 2, squareHalfHeight * 2); ds.FillRoundedRectangle(rect, 4, 4, new CanvasLinearGradientBrush(sender, Windows.UI.Colors.White, HSV.HSVtoRGB(hsv.H)) { StartPoint = new Vector2(Center.X - squareHalfWidth, Center.Y), EndPoint = new Vector2(Center.X + squareHalfWidth, Center.Y) }); ds.FillRoundedRectangle(rect, 4, 4, new CanvasLinearGradientBrush(sender, Windows.UI.Colors.Transparent, Windows.UI.Colors.Black) { StartPoint = new Vector2(Center.X, Center.Y - squareHalfHeight), EndPoint = new Vector2(Center.X, Center.Y + squareHalfHeight) }); ds.DrawRoundedRectangle(rect, 4, 4, Windows.UI.Colors.Gray); //Thumb float px = ((float)hsv.S - 50) * squareHalfWidth / 50 + Center.X; float py = (50 - (float)hsv.V) * squareHalfHeight / 50 + Center.Y; ds.DrawCircle(px, py, 9, Windows.UI.Colors.Black, 5); ds.DrawCircle(px, py, 9, Windows.UI.Colors.White, 3); }
/// <summary> /// Palette color from colors /// </summary> /// <param name="colors"> Color array. </param> /// <returns> Color </returns> public static Color GetPaletteFromColors(Color[] colors) { try { //saturation double sumS = 0; //value double sumV = 0; double sumHue = 0; double maxV = 0; double maxS = 0; double maxH = 0; double count = 0; foreach (var color in colors) { HSV hsv = HSV.RGBtoHSV(color); if (hsv.H == 0)continue; maxS = hsv.S > maxS ? hsv.S : maxS; maxV = hsv.V > maxV ? hsv.V : maxV; maxH = hsv.H > maxH ? hsv.H : maxH; sumHue += hsv.H; sumS += hsv.S; sumV += hsv.V; count++; } double avgH = sumHue / count; double avgV = sumV / count; double avgS = sumS / count; double maxAvgV = maxV / 2; double maxAvgS = maxS / 2; double maxAvgH = maxH / 2; double h = Math.Max(maxAvgV, avgV); double s = Math.Min(maxAvgS, avgS); double hue = Math.Min(maxAvgH, avgH); double R = 0; double G = 0; double B = 0; count = 0; foreach (var color in colors) { HSV hsv = HSV.RGBtoHSV(color); if (hsv.H == 0) continue; if (hsv.H >= hue + 10 && hsv.V >= h && hsv.S >= s) { R += color.R; G += color.G; B += color.B; count++; } } double r = R / count; double g = G / count; double b = B / count; // if (r + g + b > 96 && r + g + b < 672) return Color.FromArgb(255, (byte)r, (byte)g, (byte)b); } catch (Exception) { return FallBackColor; } }
/// <summary> Override <see cref="PaletteBase.GetValue"/>. </summary> public override float GetValue(HSV hsv) => hsv.S;
/// <summary> Override <see cref="PaletteBase.GetHSL"/>. </summary> public override HSV GetHSL(HSV hsv, float value) => new HSV(hsv.A, hsv.H, value, hsv.V);
/// <summary> Override <see cref="PalettePicker.GetHSV"/>. </summary> public override HSV GetHSV(HSV hsv, float value) => new HSV(hsv.A, hsv.H, hsv.S, value);
/// <summary> /// Get the slider background brush value from HSV /// </summary> /// <param name="hsv"> HSV </param> /// <returns> GradientStopCollection </returns> public abstract GradientStopCollection GetSliderBrush(HSV hsv);
/// <summary> /// Get the corresponding value from HSV /// </summary> /// <param name="hsv"></param> /// <returns> Value </returns> public abstract float GetValue(HSV hsv);
/// <summary> /// Change the current value to get the HSV /// </summary> /// <param name="hsv"> HSV</param> /// <param name="value"> The source value. </param> /// <returns> HSV </returns> public abstract HSV GetHSV(HSV hsv, float value);
/// <summary> /// Occurs when dragging on a palette. /// </summary> /// <param name="hsv"> HSV </param> /// <param name="position"> Position </param> /// <param name="squareHalfWidth"> Palette square half width. </param> /// <param name="squareHalfHeight"> Palette square half height. </param> /// <returns> HSV </returns> public abstract HSV Delta(HSV hsv, Vector2 position, float squareHalfWidth, float squareHalfHeight);
/// <summary> /// Draw /// </summary> /// <param name="sender"> CanvasControl </param> /// <param name="ds"> DrawingSession </param> /// <param name="hsv"> HSV </param> /// <param name="center"> Center </param> /// <param name="squareHalfWidth"> Palette square half width. </param> /// <param name="squareHalfHeight"> Palette square half height. </param> /// <param name="stroke"> The stroke brush. </param> public abstract void Draw(CanvasControl sender, CanvasDrawingSession ds, HSV hsv, Vector2 center, float squareHalfWidth, float squareHalfHeight, SolidColorBrush stroke);
/// <summary> Override <see cref="PaletteBase.GetValue"/>. </summary> public override float GetValue(HSV HSV) => HSV.H;