Example #1
0
        public CropService(FrameworkElement adornedElement)
        {
            if (adornedElement == null)
            {
                return;
            }

            // Make sure menus are hidden when cropping
            UILogic.UC.Close_UserControls();

            // Show context menu
            _ = new CropContextMenu();

            canvas = new Canvas
            {
                Height = adornedElement.ActualHeight,
                Width  = adornedElement.ActualWidth
            };

            cropAdorner = new CropAdorner(adornedElement, canvas);
            var adornerLayer = AdornerLayer.GetAdornerLayer(adornedElement);

            Debug.Assert(adornerLayer != null, nameof(adornerLayer) + " != null");

            adornerLayer.Add(cropAdorner);

            var cropShape = new CropShape(
                new Rectangle
            {
                Height          = 4,
                Width           = 4,
                Stroke          = (SolidColorBrush)Application.Current.Resources["MainColorBrush"],
                StrokeThickness = 2
            }
                );

            cropTool      = new CropTool(canvas);
            createState   = new CreateState(cropTool, canvas);
            completeState = new CompleteState();
            dragState     = new DragState(cropTool, canvas);

            currentToolState = completeState;

            cropAdorner.PreviewMouseLeftButtonDown += AdornerOnMouseLeftButtonDown;
            cropAdorner.PreviewMouseMove           += AdornerOnMouseMove;
            cropAdorner.PreviewMouseLeftButtonUp   += AdornerOnMouseLeftButtonUp;

            cropTool.Redraw(0, 0, 0, 0);
        }
Example #2
0
        public CropService(FrameworkElement adornedElement, bool squareSelection)
        {
            //Hack: added by thr
            _squareSelection = squareSelection;

            _canvas = new Canvas
            {
                Height = adornedElement.ActualHeight,
                Width  = adornedElement.ActualWidth
            };
            _cropAdorner = new CropAdorner(adornedElement, _canvas);
            var adornerLayer = AdornerLayer.GetAdornerLayer(adornedElement);

            Debug.Assert(adornerLayer != null, nameof(adornerLayer) + " != null");
            adornerLayer.Add(_cropAdorner);

            var cropShape = new CropShape(
                new Rectangle
            {
                Height          = 0,
                Width           = 0,
                Stroke          = Brushes.Black,
                StrokeThickness = 1.5
            },
                new Rectangle
            {
                Stroke          = Brushes.White,
                StrokeDashArray = new DoubleCollection(new double[] { 4, 4 })
            }
                );

            _cropTool         = new CropTool(_canvas, _squareSelection);
            _createState      = new CreateState(_cropTool, _canvas);
            _completeState    = new CompleteState();
            _dragState        = new DragState(_cropTool, _canvas);
            _currentToolState = _completeState;

            _cropAdorner.MouseLeftButtonDown += AdornerOnMouseLeftButtonDown;
            _cropAdorner.MouseMove           += AdornerOnMouseMove;
            _cropAdorner.MouseLeftButtonUp   += AdornerOnMouseLeftButtonUp;

            _cropTool.Redraw(0, 0, 0, 0);
        }
Example #3
0
        private static async Task CropImageWithShapeAsync(WriteableBitmap writeableBitmap, IRandomAccessStream stream, Rect croppedRect, BitmapFileFormat bitmapFileFormat, CropShape cropShape)
        {
            var device       = CanvasDevice.GetSharedDevice();
            var clipGeometry = CreateClipGeometry(device, cropShape, new Size(croppedRect.Width, croppedRect.Height));

            if (clipGeometry == null)
            {
                return;
            }

            CanvasBitmap sourceBitmap = null;

            using (var randomAccessStream = new InMemoryRandomAccessStream())
            {
                await CropImageAsync(writeableBitmap, randomAccessStream, croppedRect, bitmapFileFormat);

                sourceBitmap = await CanvasBitmap.LoadAsync(device, randomAccessStream);
            }

            using (var offScreen = new CanvasRenderTarget(device, (float)croppedRect.Width, (float)croppedRect.Height, 96f))
            {
                using (var drawingSession = offScreen.CreateDrawingSession())
                    using (var markCommandList = new CanvasCommandList(device))
                    {
                        using (var markDrawingSession = markCommandList.CreateDrawingSession())
                        {
                            markDrawingSession.FillGeometry(clipGeometry, Colors.Black);
                        }

                        var alphaMaskEffect = new AlphaMaskEffect
                        {
                            Source    = sourceBitmap,
                            AlphaMask = markCommandList
                        };
                        drawingSession.DrawImage(alphaMaskEffect);
                        alphaMaskEffect.Dispose();
                    }

                clipGeometry.Dispose();
                sourceBitmap.Dispose();
                var pixelBytes    = offScreen.GetPixelBytes();
                var bitmapEncoder = await BitmapEncoder.CreateAsync(GetEncoderId(bitmapFileFormat), stream);

                bitmapEncoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied, offScreen.SizeInPixels.Width, offScreen.SizeInPixels.Height, 96.0, 96.0, pixelBytes);
                await bitmapEncoder.FlushAsync();
            }
        }
Example #4
0
        private static CanvasGeometry CreateClipGeometry(ICanvasResourceCreator resourceCreator, CropShape cropShape, Size croppedSize)
        {
            switch (cropShape)
            {
            case CropShape.Rectangular:
                break;

            case CropShape.Circular:
                var radiusX = croppedSize.Width / 2;
                var radiusY = croppedSize.Height / 2;
                var center  = new Point(radiusX, radiusY);
                return(CanvasGeometry.CreateEllipse(resourceCreator, center.ToVector2(), (float)radiusX, (float)radiusY));
            }

            return(null);
        }