private async void Cancel_Click(object sender, RoutedEventArgs e)
        {
            if (CropToolbar != null && CropToolbar.Visibility == Visibility.Visible)
            {
                // Reset Cropper
                await Cropper.SetSourceAsync(_media.File, _media.EditState.Rotation, _media.EditState.Flip, _media.EditState.Proportions, _media.EditState.Rectangle);

                _rotation      = _media.EditState.Rotation;
                _flip          = _media.EditState.Flip;
                Crop.IsChecked = IsCropped(Cropper.CropRectangle);
                ResetUiVisibility();
            }
            else if (DrawToolbar != null && DrawToolbar.Visibility == Visibility.Visible)
            {
                Canvas.RestoreState();

                ResetUiVisibility();
                SettingsService.Current.Pencil = DrawSlider.GetDefault();
            }
            else
            {
                if (_media is StorageMedia)
                {
                    _media.EditState = _originalMediaEditState; // Reset to state before starting editing
                }
                if (_media is StorageVideo video)
                {
                    video.IsMuted     = _originalVideoIsMuted;
                    video.Compression = _originalVideoCompression;
                }
                ResetUiVisibility();
                Hide(ContentDialogResult.Secondary);
            }
        }
        private async void Button_Click(object sender, RoutedEventArgs e)
        {
            FileOpenPicker fo = new FileOpenPicker();

            fo.FileTypeFilter.Add(".png");
            fo.FileTypeFilter.Add(".jpg");
            fo.SuggestedStartLocation = PickerLocationId.Desktop;

            var file = await fo.PickSingleFileAsync();

            if (file != null)
            {
                Cropper.Reset();
                Canvas.Reset();
                await Cropper.SetSourceAsync(file);

                Canvas.SetFile(file);

                Canvas.SetSource(Cropper._software);
                Canvas.SetRect(Cropper.CropRectangle);
                //if (!_hasMessageContext) //TODO: Fix mask bug, remove hack (#2017 references mask position)
                //{
                //    await Cropper.SetSourceAsync(_media.File, _media.EditState.Rotation, _media.EditState.Flip, _media.EditState.Proportions, _media.EditState.Rectangle);
                //    Cropper.SetProportions(_media.EditState.Proportions);
                //}
                //Cropper.IsCropEnabled = true;
            }
        }
        private async void Rotate_Click(object sender, RoutedEventArgs e)
        {
            var rotation = BitmapRotation.None;

            var proportions = RotateProportions(Cropper.Proportions);
            var rectangle   = RotateArea(Cropper.CropRectangle);

            switch (_rotation)
            {
            case BitmapRotation.None:
                rotation = BitmapRotation.Clockwise90Degrees;
                break;

            case BitmapRotation.Clockwise90Degrees:
                rotation = BitmapRotation.Clockwise180Degrees;
                break;

            case BitmapRotation.Clockwise180Degrees:
                rotation = BitmapRotation.Clockwise270Degrees;
                break;
            }

            _rotation = rotation;
            await Cropper.SetSourceAsync(_file, rotation, _flip, proportions, rectangle);

            Rotate.IsChecked = _rotation != BitmapRotation.None;
            Canvas.Invalidate();
        }
Example #4
0
        private async void AccepscdtButton_Click(object sender, RoutedEventArgs e)
        {
            FileOpenPicker fo = new FileOpenPicker();

            fo.FileTypeFilter.Add(".png");
            fo.FileTypeFilter.Add(".jpg");
            fo.SuggestedStartLocation = PickerLocationId.Desktop;

            var file = await fo.PickSingleFileAsync();

            if (file != null)
            {
                ResetUI();
                Cropper.Reset();
                Canvas.Reset();
                await Cropper.SetSourceAsync(file);

                Canvas.SetFile(file);

                Canvas.SetSource(Cropper._software);
                Canvas.SetRect(Cropper.CropRectangle);

                DisbaleCloseButton();
                CropMode(true, false);
            }
        }
Example #5
0
        public EditYourPhotoView(StorageFile file)
        {
            InitializeComponent();

            //_inkPresenter = Canvas.InkPresenter;
            //_inkPresenter.InputDeviceTypes = CoreInputDeviceTypes.Mouse | CoreInputDeviceTypes.Pen | CoreInputDeviceTypes.Touch;

            Loaded += async(s, args) =>
            {
                await Cropper.SetSourceAsync(file);
            };
        }
        private async void Save_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
        {
            LoadingControl.IsLoading           = true;
            MainPage.ThisPage.IsAnyTaskRunning = true;

            using (IRandomAccessStream Stream = await OriginFile.OpenAsync(FileAccessMode.ReadWrite))
            {
                Stream.Size = 0;
                switch (OriginFile.FileType)
                {
                case ".png":
                    await Cropper.SaveAsync(Stream, BitmapFileFormat.Png).ConfigureAwait(true);

                    break;

                case ".jpg":
                case ".jpeg":
                    await Cropper.SaveAsync(Stream, BitmapFileFormat.Jpeg).ConfigureAwait(true);

                    break;

                case ".bmp":
                    await Cropper.SaveAsync(Stream, BitmapFileFormat.Bmp).ConfigureAwait(true);

                    break;

                case ".gif":
                    await Cropper.SaveAsync(Stream, BitmapFileFormat.Gif).ConfigureAwait(true);

                    break;

                case ".tiff":
                    await Cropper.SaveAsync(Stream, BitmapFileFormat.Tiff).ConfigureAwait(true);

                    break;

                default:
                    await Cropper.SaveAsync(Stream, BitmapFileFormat.Png).ConfigureAwait(true);

                    await OriginFile.RenameAsync(Path.GetFileNameWithoutExtension(OriginFile.Name) + ".png", NameCollisionOption.GenerateUniqueName);

                    break;
                }
            }

            await Task.Delay(1000).ConfigureAwait(true);

            LoadingControl.IsLoading           = false;
            MainPage.ThisPage.IsAnyTaskRunning = false;

            FileControlNav.GoBack();
        }
Example #7
0
        public void TestInvalidParameter()
        {
            var cropper = Cropper.CreateCropper();

            try
            {
                cropper.AddParameter(Model.Tools.Common.ParameterName.Brightness, new Parameter <Double>(150));
                Assert.Fail("The Parameter Name is not valid");
            }
            catch (Exception e)
            {
                Assert.True(true);
            }
        }
        private async void Save_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
        {
            LoadingControl.IsLoading           = true;
            MainPage.ThisPage.IsAnyTaskRunning = true;

            using (IRandomAccessStream Stream = await OriginFile.GetRandomAccessStreamFromFileAsync(FileAccessMode.ReadWrite).ConfigureAwait(true))
            {
                switch (OriginFile.Type.ToLower())
                {
                case ".png":
                    await Cropper.SaveAsync(Stream, BitmapFileFormat.Png).ConfigureAwait(true);

                    break;

                case ".jpg":
                case ".jpeg":
                    await Cropper.SaveAsync(Stream, BitmapFileFormat.Jpeg).ConfigureAwait(true);

                    break;

                case ".bmp":
                    await Cropper.SaveAsync(Stream, BitmapFileFormat.Bmp).ConfigureAwait(true);

                    break;

                case ".gif":
                    await Cropper.SaveAsync(Stream, BitmapFileFormat.Gif).ConfigureAwait(true);

                    break;

                case ".tiff":
                    await Cropper.SaveAsync(Stream, BitmapFileFormat.Tiff).ConfigureAwait(true);

                    break;

                default:
                    await Cropper.SaveAsync(Stream, BitmapFileFormat.Png).ConfigureAwait(true);

                    break;
                }
            }

            await Task.Delay(1000).ConfigureAwait(true);

            LoadingControl.IsLoading           = false;
            MainPage.ThisPage.IsAnyTaskRunning = false;

            Frame.GoBack();
        }
        private async void Accept_Click(object sender, RoutedEventArgs e)
        {
            if (Cropper.IsCropEnabled)
            {
                if (_media != null)
                {
                    var rect = Cropper.CropRectangle;
                    var w    = Cropper.PixelWidth;
                    var h    = Cropper.PixelHeight;

                    _media.EditState = new BitmapEditState
                    {
                        //Rectangle = new Rect(rect.X * w, rect.Y * h, rect.Width * w, rect.Height * h),
                        Rectangle   = rect,
                        Proportions = Cropper.Proportions,
                        Strokes     = Canvas.Strokes,
                        Flip        = _flip,
                        Rotation    = _rotation
                    };

                    Hide(ContentDialogResult.Primary);
                    return;
                }

                var cropped = await Cropper.CropAsync();

                var drawing = Canvas.Strokes;
                if (drawing != null && drawing.Count > 0)
                {
                    cropped = await ImageHelper.DrawStrokesAsync(cropped, drawing, Cropper.CropRectangle, _rotation, _flip);
                }

                Result = cropped;
                Hide(ContentDialogResult.Primary);
            }
            else
            {
                Canvas.SaveState();

                Cropper.IsCropEnabled = true;
                Canvas.IsEnabled      = false;

                BasicToolbar.Visibility = Visibility.Visible;
                DrawToolbar.Visibility  = Visibility.Collapsed;
                DrawSlider.Visibility   = Visibility.Collapsed;

                SettingsService.Current.Pencil = DrawSlider.GetDefault();
            }
        }
Example #10
0
        public void TestRepeatedParameter()
        {
            var cropper = Cropper.CreateCropper();

            cropper.AddParameter(Model.Tools.Common.ParameterName.X1, new Parameter <Double>(30));
            try
            {
                cropper.AddParameter(Model.Tools.Common.ParameterName.X1, new Parameter <Double>(100));
                Assert.Fail("You need to remove the parameter first");
            }
            catch (Exception)
            {
                Assert.IsTrue(true);
            }
        }
Example #11
0
        public void TestOutOfRangeParameter()
        {
            var cropper = Cropper.CreateCropper();

            cropper.AddParameter(Model.Tools.Common.ParameterName.X1, new Parameter <Double>(1500000));
            try
            {
                cropper.ApplyTool(_input);
                Assert.Fail("Should be between -255 and 255");
            }
            catch (Exception)
            {
                Assert.IsTrue(true);
            }
        }
Example #12
0
        public EditMediaPopup(StorageMedia media, ImageCropperMask mask = ImageCropperMask.Rectangle)
        {
            InitializeComponent();

            Canvas.Strokes = media.EditState.Strokes;

            Cropper.SetMask(mask);
            Cropper.SetProportions(mask == ImageCropperMask.Ellipse ? BitmapProportions.Square : media.EditState.Proportions);

            if (mask == ImageCropperMask.Ellipse)
            {
                Proportions.IsChecked = true;
                Proportions.IsEnabled = false;
            }

            _file  = media.File;
            _media = media;

            Loaded += async(s, args) =>
            {
                if (mask == ImageCropperMask.Ellipse)
                {
                    await Cropper.SetSourceAsync(media.File, proportions : BitmapProportions.Square);
                }
                else
                {
                    await Cropper.SetSourceAsync(media.File, media.EditState.Rotation, media.EditState.Flip, media.EditState.Proportions, media.EditState.Rectangle);
                }
            };
            Unloaded += (s, args) =>
            {
                Media.Source = null;
            };

            if (mask == ImageCropperMask.Ellipse && string.Equals(media.File.FileType, ".mp4", StringComparison.OrdinalIgnoreCase))
            {
                FindName(nameof(TrimToolbar));
                TrimToolbar.Visibility  = Visibility.Visible;
                BasicToolbar.Visibility = Visibility.Collapsed;

                InitializeVideo(media.File);
            }
        }
        public EditMediaPopup(StorageFile file, BitmapProportions proportions = BitmapProportions.Custom, ImageCropperMask mask = ImageCropperMask.Rectangle)
        {
            InitializeComponent();

            Cropper.SetMask(mask);
            Cropper.SetProportions(proportions);

            if (proportions != BitmapProportions.Custom)
            {
                Proportions.IsChecked = true;
                Proportions.IsEnabled = false;
            }

            _file = file;

            Loaded += async(s, args) =>
            {
                await Cropper.SetSourceAsync(file, proportions : proportions);
            };
        }
        private void Proportions_Click(object sender, RoutedEventArgs e)
        {
            if (Cropper.Proportions != BitmapProportions.Custom)
            {
                Cropper.SetProportions(BitmapProportions.Custom);
                Proportions.IsChecked = false;
            }
            else
            {
                var flyout = new MenuFlyout();
                var items  = Cropper.GetProportions();

                var handler = new RoutedEventHandler((s, args) =>
                {
                    if (s is MenuFlyoutItem option)
                    {
                        Cropper.SetProportions((BitmapProportions)option.Tag);
                        Proportions.IsChecked = true;
                    }
                });

                foreach (var item in items)
                {
                    var option = new MenuFlyoutItem();
                    option.Click   += handler;
                    option.Text     = ProportionsToLabelConverter.Convert(item);
                    option.Tag      = item;
                    option.MinWidth = 140;
                    option.HorizontalContentAlignment = HorizontalAlignment.Center;

                    flyout.Items.Add(option);
                }

                if (flyout.Items.Count > 0)
                {
                    flyout.ShowAt((GlyphToggleButton)sender);
                }
            }
        }
        public EditMediaPopup(StorageMedia media)
        {
            InitializeComponent();

            Canvas.Strokes = media.EditState.Strokes;

            Cropper.SetMask(ImageCropperMask.Rectangle);
            Cropper.SetProportions(media.EditState.Proportions);

            if (media.EditState.Proportions != BitmapProportions.Custom)
            {
                Proportions.IsChecked = true;
                Proportions.IsEnabled = true;
            }

            _file  = media.File;
            _media = media;

            Loaded += async(s, args) =>
            {
                await Cropper.SetSourceAsync(media.File, media.EditState.Rotation, media.EditState.Flip, media.EditState.Proportions, media.EditState.Rectangle);
            };
        }
        private void ResetButton_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
        {
            AspList.SelectedIndex = 0;
            ResetButton.IsEnabled = false;

            OriginImage.Dispose();
            OriginImage = SoftwareBitmap.Copy(OriginBackupImage);
            WriteableBitmap WBitmap = new WriteableBitmap(OriginImage.PixelWidth, OriginImage.PixelHeight);

            OriginImage.CopyToBuffer(WBitmap.PixelBuffer);
            Cropper.Source = WBitmap;

            using (SoftwareBitmap Histogram = ComputerVisionProvider.CalculateHistogram(OriginImage))
            {
                WriteableBitmap HBitmap = new WriteableBitmap(Histogram.PixelWidth, Histogram.PixelHeight);
                Histogram.CopyToBuffer(HBitmap.PixelBuffer);
                HistogramImage.Source = HBitmap;
            }

            FilterImage?.Dispose();
            FilterImage = null;
            FilterBackupImage?.Dispose();
            FilterBackupImage = null;

            AlphaSlider.ValueChanged    -= AlphaSlider_ValueChanged;
            BetaSlider.ValueChanged     -= BetaSlider_ValueChanged;
            FilterGrid.SelectionChanged -= FilterGrid_SelectionChanged;
            FilterGrid.SelectedIndex     = 0;
            FilterGrid.SelectionChanged += FilterGrid_SelectionChanged;
            AlphaSlider.Value            = 1;
            BetaSlider.Value             = 0;
            AlphaSlider.ValueChanged    += AlphaSlider_ValueChanged;
            BetaSlider.ValueChanged     += BetaSlider_ValueChanged;

            Cropper.Reset();
        }
        private async void SaveAs_Click(SplitButton sender, SplitButtonClickEventArgs args)
        {
            FileSavePicker Picker = new FileSavePicker
            {
                SuggestedFileName      = Path.GetFileNameWithoutExtension(OriginFile.Name),
                SuggestedStartLocation = PickerLocationId.Desktop
            };

            Picker.FileTypeChoices.Add($"PNG {Globalization.GetString("Transcode_Dialog_Format_Text")}", new List <string>()
            {
                ".png"
            });
            Picker.FileTypeChoices.Add($"JPEG {Globalization.GetString("Transcode_Dialog_Format_Text")}", new List <string>()
            {
                ".jpg"
            });
            Picker.FileTypeChoices.Add($"BMP {Globalization.GetString("Transcode_Dialog_Format_Text")}", new List <string>()
            {
                ".bmp"
            });
            Picker.FileTypeChoices.Add($"GIF {Globalization.GetString("Transcode_Dialog_Format_Text")}", new List <string>()
            {
                ".gif"
            });
            Picker.FileTypeChoices.Add($"TIFF {Globalization.GetString("Transcode_Dialog_Format_Text")}", new List <string>()
            {
                ".tiff"
            });

            StorageFile File = await Picker.PickSaveFileAsync();

            if (File != null)
            {
                LoadingControl.IsLoading           = true;
                MainPage.ThisPage.IsAnyTaskRunning = true;


                using (IRandomAccessStream Stream = await File.OpenAsync(FileAccessMode.ReadWrite))
                {
                    Stream.Size = 0;
                    switch (File.FileType)
                    {
                    case ".png":
                        await Cropper.SaveAsync(Stream, BitmapFileFormat.Png).ConfigureAwait(true);

                        break;

                    case ".jpg":
                    case ".jpeg":
                        await Cropper.SaveAsync(Stream, BitmapFileFormat.Jpeg).ConfigureAwait(true);

                        break;

                    case ".bmp":
                        await Cropper.SaveAsync(Stream, BitmapFileFormat.Bmp).ConfigureAwait(true);

                        break;

                    case ".gif":
                        await Cropper.SaveAsync(Stream, BitmapFileFormat.Gif).ConfigureAwait(true);

                        break;

                    case ".tiff":
                        await Cropper.SaveAsync(Stream, BitmapFileFormat.Tiff).ConfigureAwait(true);

                        break;

                    default:
                        throw new InvalidOperationException("Unsupport image format");
                    }
                }

                await Task.Delay(1000).ConfigureAwait(true);

                LoadingControl.IsLoading           = false;
                MainPage.ThisPage.IsAnyTaskRunning = false;
                FileControlNav.GoBack();
            }
        }
        private async void Flip_Click(object sender, RoutedEventArgs e)
        {
            var flip     = _flip;
            var rotation = _rotation;

            var proportions = Cropper.Proportions;
            var rectangle   = FlipArea(Cropper.CropRectangle);

            switch (rotation)
            {
            case BitmapRotation.Clockwise90Degrees:
            case BitmapRotation.Clockwise270Degrees:
                switch (flip)
                {
                case BitmapFlip.None:
                    flip = BitmapFlip.Vertical;
                    break;

                case BitmapFlip.Vertical:
                    flip = BitmapFlip.None;
                    break;

                case BitmapFlip.Horizontal:
                    flip     = BitmapFlip.None;
                    rotation = rotation == BitmapRotation.Clockwise90Degrees
                                ? BitmapRotation.Clockwise270Degrees
                                : BitmapRotation.Clockwise90Degrees;
                    break;
                }
                break;

            case BitmapRotation.None:
            case BitmapRotation.Clockwise180Degrees:
                switch (flip)
                {
                case BitmapFlip.None:
                    flip = BitmapFlip.Horizontal;
                    break;

                case BitmapFlip.Horizontal:
                    flip = BitmapFlip.None;
                    break;

                case BitmapFlip.Vertical:
                    flip     = BitmapFlip.None;
                    rotation = rotation == BitmapRotation.None
                                ? BitmapRotation.Clockwise180Degrees
                                : BitmapRotation.None;
                    break;
                }
                break;
            }

            _flip     = flip;
            _rotation = rotation;
            await Cropper.SetSourceAsync(_file, _rotation, flip, proportions, rectangle);

            //Transform.ScaleX = _flip == BitmapFlip.Horizontal ? -1 : 1;
            //Transform.ScaleY = _flip == BitmapFlip.Vertical ? -1 : 1;

            Flip.IsChecked = _flip != BitmapFlip.None;
            Canvas.Invalidate();
        }
        public EditMediaPopup(StorageMedia media, ImageCropperMask mask = ImageCropperMask.Rectangle, bool ttl = false)
        {
            InitializeComponent();

            Canvas.Strokes = media.EditState.Strokes;
            Cropper.SetMask(mask);
            if (mask == ImageCropperMask.Ellipse)
            {
                _hasMessageContext          = false;
                media.EditState.Proportions = BitmapProportions.Square;
            }
            Cropper.SetProportions(media.EditState.Proportions);

            _file  = media.File;
            _media = media;
            _originalMediaEditState = CopyBitmapEditState(media.EditState);

            Loaded += async(s, args) =>
            {
                await Cropper.SetSourceAsync(media.File, media.EditState.Rotation, media.EditState.Flip, media.EditState.Proportions, media.EditState.Rectangle);

                if (!_hasMessageContext) //TODO: Fix mask bug, remove hack (#2017 references mask position)
                {
                    await Cropper.SetSourceAsync(_media.File, _media.EditState.Rotation, _media.EditState.Flip, _media.EditState.Proportions, _media.EditState.Rectangle);

                    Cropper.SetProportions(_media.EditState.Proportions);
                }
                Cropper.IsCropEnabled = !_hasMessageContext && _media.IsVideo;
            };
            Unloaded += (s, args) =>
            {
                Media.Source = null;
            };

            #region Init UI
            if (mask == ImageCropperMask.Ellipse && string.Equals(media.File.FileType, ".mp4", StringComparison.OrdinalIgnoreCase))
            {
                FindName(nameof(TrimToolbar));
                TrimToolbar.Visibility    = Visibility.Visible;
                BasicToolbar.Visibility   = Visibility.Collapsed;
                SeparatorLeft.Visibility  = Visibility.Collapsed;
                SeparatorRight.Visibility = Visibility.Collapsed;

                InitializeVideo(media.File);
            }

            if (_media is StorageVideo video)
            {
                _originalVideoCompression = video.Compression;
                _originalVideoIsMuted     = video.IsMuted;
                Mute.IsChecked            = video.IsMuted;
                Mute.Visibility           = Visibility.Visible;
                Compress.IsChecked        = video.Compression != video.MaxCompression;
                Compress.Visibility       = video.CanCompress ? Visibility.Visible : Visibility.Collapsed;

                if (video.CanCompress)
                {
                    Compress.Glyph        = new CompressionToGlyphConverter().Convert(video.Compression, typeof(string), null, video.MaxCompression.ToString()).ToString();
                    Compress.CheckedGlyph = Compress.Glyph;
                    Compress.IsChecked    = video.Compression != video.MaxCompression;
                }
            }
            else
            {
                Mute.Visibility     = Visibility.Collapsed;
                Compress.Visibility = Visibility.Collapsed;
            }

            Crop.Visibility = _media is StoragePhoto ? Visibility.Visible : Visibility.Collapsed;
            Draw.Visibility = Crop.Visibility;
            Ttl.Visibility  = ttl ? Visibility.Visible : Visibility.Collapsed;
            Ttl.IsChecked   = _media.Ttl > 0;

            if (_media.EditState is BitmapEditState editSate)
            {
                Crop.IsChecked = editSate.Proportions != BitmapProportions.Custom ||
                                 editSate.Flip != BitmapFlip.None ||
                                 editSate.Rotation != BitmapRotation.None ||
                                 (!editSate.Rectangle.IsEmpty &&
                                  (editSate.Rectangle.X > 0 || editSate.Rectangle.Y > 0 ||
                                   Math.Abs(editSate.Rectangle.Width - 1) > 0.1f || Math.Abs(editSate.Rectangle.Height - 1) > 0.1f));

                Draw.IsChecked = editSate.Strokes != null && editSate.Strokes.Count > 0;
            }
            else
            {
                Crop.IsChecked = false;
                Draw.IsChecked = false;
            }

            if (_hasMessageContext)
            {
                if (!string.IsNullOrWhiteSpace(media.Caption?.Text))
                {
                    CaptionInput.SetText(media.Caption);
                }
            }
            else
            {
                CaptionInput.Visibility = Visibility.Collapsed;
            }
            #endregion
        }
Example #20
0
        private async void Accept_Click(object sender, RoutedEventArgs e)
        {
            Result = await Cropper.CropAsync(640, 640);

            Hide(ContentDialogBaseResult.OK);
        }
 public MainPage()
 {
     this.InitializeComponent();
     Cropper.SetMask(ImageCropperMask.Rectangle);
     Loaded += MainPage_Loaded;
 }