using System;
using System.Threading;
using System.Threading.Tasks;
using ClusterNet.Kernels;
using ClusterNet.Methods;
using OwlCore;
using OwlCore.WinUI.ColorExtractor;
using OwlCore.WinUI.ColorExtractor.ColorSpaces;
using OwlCore.WinUI.ColorExtractor.Filters;
using OwlCore.WinUI.ColorExtractor.Shapes;
using Color = Windows.UI.Color;
namespace StrixMusic.Shells.Groove.Helper
{
///
/// A class containing methods for handling dyanmic coloring.
///
public static class DynamicColorHelper
{
private static SemaphoreSlim _mutex = new SemaphoreSlim(1, 1);
///
/// Gets an accent color from an .
///
/// The image to get a color from.
/// The accent color for the image.
public static async Task GetImageAccentColorAsync(Uri imageUri)
{
using (await Flow.EasySemaphore(_mutex))
{
var image = await ImageParser.GetImage(imageUri.OriginalString);
if (image is null)
return Color.FromArgb(255, 0, 0, 0);
var filters = new FilterCollection();
filters.Add(new WhiteFilter(.4f));
filters.Add(new BlackFilter(.15f));
filters.Add(new GrayFilter(.3f));
var clamps = new FilterCollection();
clamps.Add(new SaturationFilter(.6f));
var colors = ImageParser.GetImageColors(image, 1920);
colors = filters.Filter(colors, 160);
//var palette = KMeansMethod.KMeans(colors, 3);
var kernel = new GaussianKernel(.15);
var palette = ClusterAlgorithms.WeightedMeanShift(colors, kernel, Math.Min(colors.Length, 480));
var primary = clamps.Clamp(palette[0].Item1);
var finalColor = Color.FromArgb(255,
(byte)(primary.R * 255),
(byte)(primary.G * 255),
(byte)(primary.B * 255)
);
return finalColor;
}
}
}
}