public static BitmapSource OverlayInk(BitmapSource bitmapSource, double scale, StrokeCollection inkStrokes) { if (bitmapSource == null) { return((BitmapSource)null); } if (inkStrokes == null || inkStrokes.Count == 0) { return(bitmapSource); } Rect rect1 = new Rect(0.0, 0.0, (double)bitmapSource.PixelWidth, (double)bitmapSource.PixelHeight); Vector offsetVector = (Vector)RectExtensions.GetCenter(rect1); Rect rect2 = RectExtensions.Union(Enumerable.Select <Stroke, Rect>((IEnumerable <Stroke>)inkStrokes, (Func <Stroke, Rect>)(stroke => stroke.GetBounds()))); rect2.Scale(scale, scale); rect2.Offset(offsetVector); Rect rect3 = Rect.Union(rect1, rect2); Canvas canvas1 = new Canvas(); canvas1.Width = rect3.Width; canvas1.Height = rect3.Height; canvas1.Children.Add((UIElement) new Image() { Source = (ImageSource)bitmapSource }); UIElementCollection children = canvas1.Children; InkPresenter inkPresenter1 = new InkPresenter(); inkPresenter1.Strokes = inkStrokes; inkPresenter1.Margin = new Thickness(offsetVector.X, offsetVector.Y, -offsetVector.X, -offsetVector.Y); inkPresenter1.LayoutTransform = (Transform) new ScaleTransform(scale, scale); InkPresenter inkPresenter2 = inkPresenter1; children.Add((UIElement)inkPresenter2); Canvas canvas2 = canvas1; Point newOrigin = new Point(-rect3.Left, -rect3.Top); EnumerableExtensions.ForEach <UIElement>(Enumerable.OfType <UIElement>((IEnumerable)canvas2.Children), (Action <UIElement>)(child => DependencyObjectExtensions.SetCanvasPos((DependencyObject)child, newOrigin))); return(new FrameworkElementCapturer((FrameworkElement)canvas2, ImageCapturer.MaxSize).Capture()); }