59 lines
1.8 KiB
C#
59 lines
1.8 KiB
C#
|
|
using System;
|
|||
|
|
|
|||
|
|
using WPFDark.Internals;
|
|||
|
|
|
|||
|
|
namespace WPFDark.Internals
|
|||
|
|
{
|
|||
|
|
internal static class ColorSpaceHelper
|
|||
|
|
{
|
|||
|
|
internal static (double Hue, double Saturation, double Value) RgbToHsv(double red, double green, double blue)
|
|||
|
|
{
|
|||
|
|
var max = (red, green, blue).Max();
|
|||
|
|
var min = (red, green, blue).Min();
|
|||
|
|
|
|||
|
|
var h = 0.0;
|
|||
|
|
var s = 0.0;
|
|||
|
|
var v = max;
|
|||
|
|
|
|||
|
|
if (NumberHelper.AreClose(max, min) == false)
|
|||
|
|
{
|
|||
|
|
if (NumberHelper.AreClose(max, red)) h = 60.0 / 360 * (green - blue) / (max - min);
|
|||
|
|
else if (NumberHelper.AreClose(max, green)) h = 60.0 / 360 * (blue - red) / (max - min) + 120.0 / 360;
|
|||
|
|
else if (NumberHelper.AreClose(max, blue)) h = 60.0 / 360 * (red - green) / (max - min) + 240.0 / 360;
|
|||
|
|
|
|||
|
|
s = (max - min) / max;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (h < 0)
|
|||
|
|
h += 1;
|
|||
|
|
|
|||
|
|
return (h, s, v);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
internal static (double Red, double Green, double Blue) HsvToRgb(double hue, double saturation, double value)
|
|||
|
|
{
|
|||
|
|
var h = NumberHelper.AreClose(hue, 1) ? 0 : hue;
|
|||
|
|
var s = saturation;
|
|||
|
|
var v = value;
|
|||
|
|
|
|||
|
|
if (NumberHelper.AreCloseZero(s))
|
|||
|
|
return (v, v, v);
|
|||
|
|
|
|||
|
|
var dh = Math.Floor(h / (60.0 / 360));
|
|||
|
|
var p = v * (1 - s);
|
|||
|
|
var q = v * (1 - s * (h / (60.0 / 360) - dh));
|
|||
|
|
var t = v * (1 - s * (1 - (h / (60.0 / 360) - dh)));
|
|||
|
|
|
|||
|
|
return dh switch
|
|||
|
|
{
|
|||
|
|
0 => (v, t, p),
|
|||
|
|
1 => (q, v, p),
|
|||
|
|
2 => (p, v, t),
|
|||
|
|
3 => (p, q, v),
|
|||
|
|
4 => (t, p, v),
|
|||
|
|
5 => (v, p, q),
|
|||
|
|
_ => throw new Exception()
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|