You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

139 lines
5.2 KiB
C#

using SciColorMaps.Portable;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace Txgy.Controls
{
/// <summary>
/// ColorMapBar.xaml 的交互逻辑
/// </summary>
public partial class ColorMapBar : UserControl
{
public static readonly DependencyProperty UcWidthProperty = DependencyProperty.Register("UcWidth", typeof(double), typeof(ColorMapBar), new PropertyMetadata(40.0));
public double UcWidth
{
get { return (double)GetValue(UcWidthProperty); }
set { SetValue(UcWidthProperty, value); }
}
public static readonly DependencyProperty UcHeightProperty = DependencyProperty.Register("UcHeight", typeof(double), typeof(ColorMapBar), new PropertyMetadata(200.0));
public double UcHeight
{
get { return (double)GetValue(UcHeightProperty); }
set { SetValue(UcHeightProperty, value); }
}
public static readonly DependencyProperty TopDepthProperty = DependencyProperty.Register("TopDepthProperty", typeof(double), typeof(ColorMapBar), new PropertyMetadata(200.0));
public double TopDepth
{
get { return (double)GetValue(TopDepthProperty); }
set { SetValue(TopDepthProperty, value); }
}
public static readonly DependencyProperty BottomDepthProperty = DependencyProperty.Register("BottomDepthProperty", typeof(double), typeof(ColorMapBar), new PropertyMetadata(900.0));
public double BottomDepth
{
get { return (double)GetValue(BottomDepthProperty); }
set { SetValue(BottomDepthProperty, value); }
}
public static readonly DependencyProperty ColorPaletteProperty = DependencyProperty.Register("ColorPaletteProperty", typeof(string), typeof(ColorMapBar), new PropertyMetadata("plasma"));
public string ColorPalette
{
get { return (string)GetValue(ColorPaletteProperty); }
set
{
SetValue(ColorPaletteProperty, value);
UpdatePanels();
}
}
public static readonly DependencyProperty PaletteBrushProperty = DependencyProperty.Register("PaletteBrushProperty", typeof(LinearGradientBrush), typeof(ColorMapBar), new PropertyMetadata(null));
public LinearGradientBrush PaletteBrush
{
get { return (LinearGradientBrush)GetValue(PaletteBrushProperty); }
set
{
SetValue(PaletteBrushProperty, value);
//UpdatePanels();
}
}
public ColorMap colorMap;
private const int ColorCountDefault = 256;
public static List<string> Palettes { get; } = ColorMap.Palettes.ToList();
//public LinearGradientBrush PaletteBrush { get; set; }
private string _selectedPalette = Palettes.FirstOrDefault();
public string SelectedPalette
{
get { return _selectedPalette; }
set
{
_selectedPalette = value;
UpdatePanels();
}
}
public Color[] colors;
public ColorMapBar()
{
InitializeComponent();
UpdatePanels();
}
private void UpdatePanels()
{
//var colors = new[]
//{
// new byte[] {0, 0, 0},
// new byte[] {255, 255, 0},
// new byte[] {255, 0, 0},
// new byte[] {255, 255, 255}
//};
//var positions = new[] { 0, 0.3f, 0.7f, 1 };
//var cmap1 = ColorMap.CreateFromColors(colors, positions, colorCount: ColorCountDefault);
colorMap = new ColorMap(ColorPalette, colorCount: ColorCountDefault);
//var cmap3 = new MirrorColorMap(cmap2);
//colors = CreateColors(colorMap);
PaletteBrush = CreatePaletteBrush(colorMap);
}
private Color[] CreateColors(ColorMap cmap)
{
return cmap.Colors().Select((color)=>color.ToMediaColor()).ToArray();
}
private LinearGradientBrush CreatePaletteBrush(ColorMap cmap)
{
return new LinearGradientBrush
{
StartPoint = new System.Windows.Point(0, 0),
EndPoint = new System.Windows.Point(0, 1),
GradientStops = new GradientStopCollection(
cmap.Colors()
.Select((color, i) => new GradientStop()
{
Color = color.ToMediaColor(),
Offset = (float)(ColorCountDefault-i) / ColorCountDefault
})
.ToList())
};
}
}
public static class ColorUtils
{
public static Color ToMediaColor(this byte[] rgb)
{
return Color.FromRgb(rgb[0], rgb[1], rgb[2]);
}
}
}