Files
Shrlalgo.RvKits/Melskin/Converters/Internal/HueToColorConverter.cs
2026-02-17 22:17:13 +08:00

76 lines
2.3 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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.");
}
}