功能更新
This commit is contained in:
75
Melskin/Converters/Internal/HueToColorConverter.cs
Normal file
75
Melskin/Converters/Internal/HueToColorConverter.cs
Normal file
@@ -0,0 +1,75 @@
|
||||
using System.Globalization;
|
||||
using System.Windows.Data;
|
||||
using Melskin.Controls;
|
||||
|
||||
namespace Melskin.Converters.Internal;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 表示一个值转换器,用于将色调(Hue)值转换为对应的RGB颜色。该转换器实现了IValueConverter接口,
|
||||
/// 通过Convert方法接收一个表示色调的int类型的值,并将其转换成System.Windows.Media.Color结构体中的颜色。
|
||||
/// 转换过程中,饱和度和亮度均设为最大值(1.0),透明度设为完全不透明(255)。如果输入不是有效的int类型或者转换失败,则返回透明色。
|
||||
/// ConvertBack方法目前未实现,尝试调用它会抛出NotImplementedException异常。
|
||||
/// 此转换器适用于需要根据给定的色调快速生成对应RGB颜色的应用场景。
|
||||
/// </summary>
|
||||
internal class HueToColorConverter : IValueConverter
|
||||
{
|
||||
public object Convert(object? value,
|
||||
Type t,
|
||||
object? p,
|
||||
CultureInfo c) =>
|
||||
value is int hue
|
||||
? ColorPanel.HsvToRgb(hue,
|
||||
1.0,
|
||||
1.0,
|
||||
255)
|
||||
: Colors.Transparent;
|
||||
|
||||
public object ConvertBack(object? value, Type t, object? p, CultureInfo c)
|
||||
{
|
||||
if (value is Color color)
|
||||
{
|
||||
// 将RGB颜色转换为HSV颜色
|
||||
var r = color.R / 255.0;
|
||||
var g = color.G / 255.0;
|
||||
var b = color.B / 255.0;
|
||||
|
||||
var max = Math.Max(r, Math.Max(g, b));
|
||||
var min = Math.Min(r, Math.Min(g, b));
|
||||
var delta = max - min;
|
||||
|
||||
double h = 0, s = 0, v = max;
|
||||
|
||||
if (delta != 0)
|
||||
{
|
||||
if (r == max)
|
||||
{
|
||||
h = (g - b) / delta;
|
||||
}
|
||||
else if (g == max)
|
||||
{
|
||||
h = 2 + (b - r) / delta;
|
||||
}
|
||||
else if (b == max)
|
||||
{
|
||||
h = 4 + (r - g) / delta;
|
||||
}
|
||||
|
||||
h *= 60;
|
||||
if (h < 0)
|
||||
{
|
||||
h += 360;
|
||||
}
|
||||
|
||||
s = delta / max;
|
||||
}
|
||||
|
||||
return (int)Math.Round(h); // 返回整数色调值
|
||||
}
|
||||
|
||||
throw new ArgumentException("Invalid input type for conversion.");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user