diff --git a/src/PicView.Avalonia/Views/EffectsView.axaml b/src/PicView.Avalonia/Views/EffectsView.axaml index 041dfc016..7549be459 100644 --- a/src/PicView.Avalonia/Views/EffectsView.axaml +++ b/src/PicView.Avalonia/Views/EffectsView.axaml @@ -7,7 +7,7 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> - + - - + + + + + + + + + + + + + x:Name="EmbossSlider" /> diff --git a/src/PicView.Avalonia/Views/EffectsView.axaml.cs b/src/PicView.Avalonia/Views/EffectsView.axaml.cs index ded26abe3..ed1d3bb94 100644 --- a/src/PicView.Avalonia/Views/EffectsView.axaml.cs +++ b/src/PicView.Avalonia/Views/EffectsView.axaml.cs @@ -1,12 +1,109 @@ using Avalonia.Controls; +using Avalonia.Controls.Primitives; +using Avalonia.Media.Imaging; +using ImageMagick; +using PicView.Avalonia.Navigation; +using PicView.Avalonia.ViewModels; namespace PicView.Avalonia.Views; public partial class EffectsView : UserControl { + private Percentage _brightness = new(0); + private Percentage _contrast = new(0); + public EffectsView() { InitializeComponent(); - Loaded += (_, _) => { }; + Loaded += (_, _) => + { + BrightnessSlider.ValueChanged += async (_, e) => await BrightnessChanged(e).ConfigureAwait(false); + ContrastSlider.ValueChanged += async (_, e) => await ContrastChanged(e).ConfigureAwait(false); + EmbossSlider.ValueChanged += async (_, e) => await EmbossChanged(e).ConfigureAwait(false); + if (DataContext is not MainViewModel vm) + { + return; + } + + if (!NavigationHelper.CanNavigate(vm)) + { + return; + } + + // using var magick = new ImageMagick.MagickImage(vm.FileInfo); + // BrightnessSlider.Value = magick.get + + }; + } + + private async Task BrightnessChanged(RangeBaseValueChangedEventArgs e) + { + _brightness = new Percentage(e.NewValue); + if (DataContext is not MainViewModel vm) + { + return; + } + + if (!NavigationHelper.CanNavigate(vm)) + { + return; + } + await SetBrightnessContrast(vm); + } + + private async Task ContrastChanged(RangeBaseValueChangedEventArgs e) + { + _contrast = new Percentage(e.NewValue); + if (DataContext is not MainViewModel vm) + { + return; + } + + if (!NavigationHelper.CanNavigate(vm)) + { + return; + } + await SetBrightnessContrast(vm); + } + + private async Task SetBrightnessContrast(MainViewModel vm) + { + using var magick = new MagickImage(); + await magick.ReadAsync(vm.FileInfo.FullName).ConfigureAwait(false); + magick.BrightnessContrast(_brightness, _contrast); + magick.Format = MagickFormat.WebP; + magick.BackgroundColor = MagickColors.Transparent; + magick.Settings.BackgroundColor = MagickColors.Transparent; + magick.Settings.FillColor = MagickColors.Transparent; + await using var memoryStream = new MemoryStream(); + await magick.WriteAsync(memoryStream); + memoryStream.Position = 0; + var bitmap = new Bitmap(memoryStream); + vm.ImageSource = bitmap; + } + + private async Task EmbossChanged(RangeBaseValueChangedEventArgs e) + { + if (DataContext is not MainViewModel vm) + { + return; + } + + if (!NavigationHelper.CanNavigate(vm)) + { + return; + } + using var magick = new MagickImage(); + await magick.ReadAsync(vm.FileInfo.FullName).ConfigureAwait(false); + magick.Format = MagickFormat.WebP; + magick.BackgroundColor = MagickColors.Transparent; + magick.Settings.BackgroundColor = MagickColors.Transparent; + magick.Settings.FillColor = MagickColors.Transparent; + magick.Emboss(0, e.NewValue); + await using var memoryStream = new MemoryStream(); + await magick.WriteAsync(memoryStream); + memoryStream.Position = 0; + var bitmap = new Bitmap(memoryStream); + vm.ImageSource = bitmap; } } \ No newline at end of file