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); }
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); }
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(); } }
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); }