public string CanvasCompositeMode(CanvasComposite value) { var typeName = nameof(CanvasComposite); switch (value) { case CanvasComposite.SourceOver: return($"{typeName}{ScopeResolve}SourceOver"); case CanvasComposite.DestinationOver: return($"{typeName}{ScopeResolve}DestinationOver"); case CanvasComposite.SourceIn: return($"{typeName}{ScopeResolve}SourceIn"); case CanvasComposite.DestinationIn: return($"{typeName}{ScopeResolve}DestinationIn"); case CanvasComposite.SourceOut: return($"{typeName}{ScopeResolve}SourceOut"); case CanvasComposite.DestinationOut: return($"{typeName}{ScopeResolve}DestinationOut"); case CanvasComposite.SourceAtop: return($"{typeName}{ScopeResolve}SourceAtop"); case CanvasComposite.DestinationAtop: return($"{typeName}{ScopeResolve}DestinationAtop"); case CanvasComposite.Xor: return($"{typeName}{ScopeResolve}Xor"); case CanvasComposite.Add: return($"{typeName}{ScopeResolve}Add"); case CanvasComposite.Copy: return($"{typeName}{ScopeResolve}Copy"); case CanvasComposite.BoundedCopy: return($"{typeName}{ScopeResolve}BoundedCopy"); case CanvasComposite.MaskInvert: return($"{typeName}{ScopeResolve}MaskInvert"); default: throw new InvalidOperationException(); } }
public static void Merge() { //使Source为合成所有图层 App.InitializeCrop(); if (App.Model.isAnimated == true)//选区存在 { App.Model.Clipboard = new CanvasRenderTarget(App.Model.VirtualControl, (float)App.Model.MaskRect.Width, (float)App.Model.MaskRect.Height); using (CanvasDrawingSession ds = App.Model.Clipboard.CreateDrawingSession()) { ds.DrawImage(App.Model.SecondTopRenderTarget, (float)-App.Model.MaskRect.X, (float)-App.Model.MaskRect.Y); //扣外留内 CanvasComposite compositeMode = CanvasComposite.DestinationIn; ds.DrawImage(App.Model.MaskRenderTarget, (float)-App.Model.MaskRect.X, (float)-App.Model.MaskRect.Y, App.Model.MaskRenderTarget.Bounds, 1, CanvasImageInterpolation.Linear, compositeMode); } } else if (App.Model.isAnimated == false)//选区不存在 { App.Model.Clipboard = new CanvasRenderTarget(App.Model.VirtualControl, App.Model.Width, App.Model.Height); using (CanvasDrawingSession ds = App.Model.Clipboard.CreateDrawingSession()) { ds.DrawImage(App.Model.SecondTopRenderTarget); } } App.Model.isClipboard = true;//存在剪切板 }
public static void Extract() { //如果图层不可视或透明 if (App.Model.CurrentVisual == false) { App.Tip(); } else { //Undo:撤销 Undo undo = new Undo(); undo.TargeInstantiation(App.Model.Index, App.Model.CurrentRenderTarget); App.UndoAdd(undo); if (App.Model.isAnimated == true)//选区存在 { using (CanvasDrawingSession ds = App.Model.CurrentRenderTarget.CreateDrawingSession()) { //扣外留内 CanvasComposite compositeMode = CanvasComposite.DestinationIn; ds.DrawImage(App.Model.MaskRenderTarget, 0, 0, App.Model.MaskRenderTarget.Bounds, 1, CanvasImageInterpolation.Linear, compositeMode); } } App.Model.isReRender = true; //重新渲染 App.Model.Refresh++; //画布刷新 App.Model.Layers[App.Model.Index].SetWriteableBitmap(App.Model.VirtualControl); //刷新缩略图 } }
private static void DrawMarqueeToolEllipse(this CanvasDrawingSession drawingSession, ICanvasResourceCreator resourceCreator, TransformerRect transformerRect, Rect sourceRectangle, MarqueeCompositeMode compositeMode = MarqueeCompositeMode.New) { switch (compositeMode) { case MarqueeCompositeMode.New: { drawingSession.Clear(Windows.UI.Colors.Transparent); Vector2 centerPoint = transformerRect.Center; float width = transformerRect.Width / 2; float height = transformerRect.Height / 2; drawingSession.FillEllipse(centerPoint, width, height, Windows.UI.Colors.DodgerBlue); } break; case MarqueeCompositeMode.Add: { Vector2 centerPoint = transformerRect.Center; float width = transformerRect.Width / 2; float height = transformerRect.Height / 2; drawingSession.FillEllipse(centerPoint, width, height, Windows.UI.Colors.DodgerBlue); } break; case MarqueeCompositeMode.Subtract: { CanvasCommandList canvasCommandList = CanvasDrawingSessionExtensions.GetMarqueeToolEllipse(drawingSession, resourceCreator, transformerRect); CanvasComposite canvasComposite = CanvasComposite.DestinationOut; drawingSession.DrawImage(canvasCommandList, 0, 0, sourceRectangle, 1, CanvasImageInterpolation.Linear, canvasComposite); } break; case MarqueeCompositeMode.Intersect: { CanvasCommandList canvasCommandList = CanvasDrawingSessionExtensions.GetMarqueeToolEllipse(drawingSession, resourceCreator, transformerRect); CanvasComposite canvasComposite = CanvasComposite.DestinationIn; drawingSession.DrawImage(canvasCommandList, 0, 0, sourceRectangle, 1, CanvasImageInterpolation.Linear, canvasComposite); } break; case MarqueeCompositeMode.Xor: { CanvasCommandList canvasCommandList = CanvasDrawingSessionExtensions.GetMarqueeToolEllipse(drawingSession, resourceCreator, transformerRect); CanvasComposite canvasComposite = CanvasComposite.Xor; drawingSession.DrawImage(canvasCommandList, 0, 0, sourceRectangle, 1, CanvasImageInterpolation.Linear, canvasComposite); } break; } }
public static void Cut() { //如果图层不可视或透明 if (App.Model.CurrentVisual == false) { App.Tip(); } else { //Undo:撤销 Undo undo = new Undo(); undo.TargeInstantiation(App.Model.Index, App.Model.CurrentRenderTarget); App.UndoAdd(undo); if (App.Model.isAnimated == true)//选区存在 { App.Model.Clipboard = new CanvasRenderTarget(App.Model.VirtualControl, (float)App.Model.MaskRect.Width, (float)App.Model.MaskRect.Height); using (CanvasDrawingSession ds = App.Model.Clipboard.CreateDrawingSession()) { ds.DrawImage(App.Model.CurrentRenderTarget, (float)-App.Model.MaskRect.X, (float)-App.Model.MaskRect.Y); //扣外留内 CanvasComposite compositeMode = CanvasComposite.DestinationIn; ds.DrawImage(App.Model.MaskRenderTarget, (float)-App.Model.MaskRect.X, (float)-App.Model.MaskRect.Y, App.Model.MaskRenderTarget.Bounds, 1, CanvasImageInterpolation.Linear, compositeMode); } using (CanvasDrawingSession ds = App.Model.CurrentRenderTarget.CreateDrawingSession()) { //扣内留外 CanvasComposite compositeMode = CanvasComposite.DestinationOut; ds.DrawImage(App.Model.MaskRenderTarget, 0, 0, App.Model.MaskRenderTarget.Bounds, 1, CanvasImageInterpolation.Linear, compositeMode); } } else if (App.Model.isAnimated == false)//选区不存在 { var rect = App.GetCurrentBounds(); App.Model.Clipboard = new CanvasRenderTarget(App.Model.VirtualControl, (float)rect.Width, (float)rect.Height); using (CanvasDrawingSession ds = App.Model.Clipboard.CreateDrawingSession()) { ds.DrawImage(App.Model.CurrentRenderTarget, (float)-rect.X, (float)-rect.Y); } using (CanvasDrawingSession ds = App.Model.CurrentRenderTarget.CreateDrawingSession()) { ds.Clear(Colors.Transparent); } } App.Model.isClipboard = true; //存在剪切板 App.Model.isReRender = true; //重新渲染 App.Model.Refresh++; //画布刷新 App.Model.Layers[App.Model.Index].SetWriteableBitmap(App.Model.VirtualControl); //刷新缩略图 } }
private void Selection() { App.Model.isCanUndo = false;//关闭撤销 Layer l = App.Model.Layers[App.Model.Index]; //画布:输入源图、形状,输出带形状的源图 CanvasRenderTarget crt = new CanvasRenderTarget(App.Model.VirtualControl, App.Model.Width, App.Model.Height); using (CanvasDrawingSession ds = crt.CreateDrawingSession()) { ds.DrawImage(l.CanvasRenderTarget); CanvasComposite compositeMode = CanvasComposite.DestinationIn;//差模式 ds.DrawImage(App.Model.MaskRenderTarget, 0, 0, l.CanvasRenderTarget.Bounds, 1, CanvasImageInterpolation.Linear, compositeMode); } //新建层 Layer ll = new Layer { Visual = true, Opacity = l.Opacity, CanvasRenderTarget = crt, BlendIndex = l.BlendIndex }; if (App.Model.isLowView) { ll.LowView(); } else { ll.SquareView(); } //Undo:撤销 Undo undo = new Undo(); undo.AddInstantiation(App.Model.Index); App.UndoAdd(undo); App.Model.Layers.Insert(App.Model.Index, ll); ll.SetWriteableBitmap(App.Model.VirtualControl); //刷新缩略图 App.Model.isReRender = true; //重新渲染 App.Model.Refresh++; //画布刷新 App.Model.LayersCount = App.Model.Layers.Count; //Undo:撤销 App.Model.isCanUndo = true; //打开撤销 }
private static void DrawMarqueeToolRectangular(this CanvasDrawingSession drawingSession, ICanvasResourceCreator resourceCreator, TransformerRect transformerRect, Rect sourceRectangle, MarqueeCompositeMode compositeMode = MarqueeCompositeMode.New) { switch (compositeMode) { case MarqueeCompositeMode.New: { drawingSession.Clear(Windows.UI.Colors.Transparent); Rect rect = transformerRect.ToRect(); drawingSession.FillRectangle(rect, Windows.UI.Colors.DodgerBlue); } break; case MarqueeCompositeMode.Add: { Rect rect = transformerRect.ToRect(); drawingSession.FillRectangle(rect, Windows.UI.Colors.DodgerBlue); } break; case MarqueeCompositeMode.Subtract: { CanvasCommandList canvasCommandList = CanvasDrawingSessionExtensions.GetMarqueeToolRectangular(drawingSession, resourceCreator, transformerRect); CanvasComposite canvasComposite = CanvasComposite.DestinationOut; drawingSession.DrawImage(canvasCommandList, 0, 0, sourceRectangle, 1, CanvasImageInterpolation.Linear, canvasComposite); } break; case MarqueeCompositeMode.Intersect: { CanvasCommandList canvasCommandList = CanvasDrawingSessionExtensions.GetMarqueeToolRectangular(drawingSession, resourceCreator, transformerRect); CanvasComposite canvasComposite = CanvasComposite.DestinationIn; drawingSession.DrawImage(canvasCommandList, 0, 0, sourceRectangle, 1, CanvasImageInterpolation.Linear, canvasComposite); } break; case MarqueeCompositeMode.Xor: { CanvasCommandList canvasCommandList = CanvasDrawingSessionExtensions.GetMarqueeToolRectangular(drawingSession, resourceCreator, transformerRect); CanvasComposite canvasComposite = CanvasComposite.Xor; drawingSession.DrawImage(canvasCommandList, 0, 0, sourceRectangle, 1, CanvasImageInterpolation.Linear, canvasComposite); } break; } }
public string CanvasCompositeMode(CanvasComposite value) { var typeName = nameof(CanvasComposite); return value switch { CanvasComposite.SourceOver => $"{typeName}{ScopeResolve}SourceOver", CanvasComposite.DestinationOver => $"{typeName}{ScopeResolve}DestinationOver", CanvasComposite.SourceIn => $"{typeName}{ScopeResolve}SourceIn", CanvasComposite.DestinationIn => $"{typeName}{ScopeResolve}DestinationIn", CanvasComposite.SourceOut => $"{typeName}{ScopeResolve}SourceOut", CanvasComposite.DestinationOut => $"{typeName}{ScopeResolve}DestinationOut", CanvasComposite.SourceAtop => $"{typeName}{ScopeResolve}SourceAtop", CanvasComposite.DestinationAtop => $"{typeName}{ScopeResolve}DestinationAtop", CanvasComposite.Xor => $"{typeName}{ScopeResolve}Xor", CanvasComposite.Add => $"{typeName}{ScopeResolve}Add", CanvasComposite.Copy => $"{typeName}{ScopeResolve}Copy", CanvasComposite.BoundedCopy => $"{typeName}{ScopeResolve}BoundedCopy", CanvasComposite.MaskInvert => $"{typeName}{ScopeResolve}MaskInvert", _ => throw new InvalidOperationException(), }; }
public static void Copy() { if (App.Model.isAnimated == true)//选区存在 { App.Model.Clipboard = new CanvasRenderTarget(App.Model.VirtualControl, (float)App.Model.MaskRect.Width, (float)App.Model.MaskRect.Height); using (CanvasDrawingSession ds = App.Model.Clipboard.CreateDrawingSession()) { ds.DrawImage(App.Model.CurrentRenderTarget, (float)-App.Model.MaskRect.X, (float)-App.Model.MaskRect.Y); //扣外留内 CanvasComposite compositeMode = CanvasComposite.DestinationIn; ds.DrawImage(App.Model.MaskRenderTarget, (float)-App.Model.MaskRect.X, (float)-App.Model.MaskRect.Y, App.Model.MaskRenderTarget.Bounds, 1, CanvasImageInterpolation.Linear, compositeMode); } } else if (App.Model.isAnimated == false)//选区不存在 { var rect = App.GetCurrentBounds(); App.Model.Clipboard = new CanvasRenderTarget(App.Model.VirtualControl, (float)rect.Width, (float)rect.Height); using (CanvasDrawingSession ds = App.Model.Clipboard.CreateDrawingSession()) { ds.DrawImage(App.Model.CurrentRenderTarget, (float)-rect.X, (float)-rect.Y); } } App.Model.isClipboard = true;//存在剪切板 }
public static void Mask(ICanvasImage VirtualImage, ICanvasImage AnimatedImage, int MaskMode = 0, bool isClear = false) { CanvasComposite compositeMode = CanvasComposite.SourceOver; switch (MaskMode) { //主模式:SourceOver case 0: compositeMode = CanvasComposite.SourceOver; break; //加模式:SourceOver case 1: compositeMode = CanvasComposite.SourceOver; break; //减模式:DestinationOut case 2: compositeMode = CanvasComposite.DestinationOut; break; //差模式:DestinationIn case 3: compositeMode = CanvasComposite.DestinationIn; break; //负模式:DestinationIn case 4: compositeMode = CanvasComposite.Xor; break; default: break; } //画布 CanvasCommandList cl = new CanvasCommandList(App.Model.VirtualControl); //新图片(列表命令) using (CanvasDrawingSession ds = cl.CreateDrawingSession()) //新图片上画几何 { ds.Clear(App.Setting.MaskColor); ds.DrawImage(VirtualImage, 0, 0, App.Model.MaskRenderTarget.Bounds, 1, CanvasImageInterpolation.Linear, CanvasComposite.DestinationIn); } using (CanvasDrawingSession ds = App.Model.MaskRenderTarget.CreateDrawingSession())//旧图片上画旧图片(并布尔运算) { if (isClear == true || MaskMode == 0) { ds.Clear(Colors.Transparent); } ds.DrawImage(cl, 0, 0, App.Model.MaskRenderTarget.Bounds, 1, CanvasImageInterpolation.Linear, compositeMode); } //动画 CanvasCommandList acl = new CanvasCommandList(App.Model.AnimatedControl); //新图片(列表命令) using (CanvasDrawingSession ds = acl.CreateDrawingSession()) //新图片上画几何 { ds.Clear(App.Setting.MaskColor); ds.DrawImage(AnimatedImage, 0, 0, App.Model.MaskRenderTarget.Bounds, 1, CanvasImageInterpolation.Linear, CanvasComposite.DestinationIn); } using (CanvasDrawingSession ds = App.Model.MaskAnimatedTarget.CreateDrawingSession())//旧图片上画旧图片(并布尔运算) { if (isClear == true || MaskMode == 0) { ds.Clear(Colors.Transparent); } ds.DrawImage(acl, 0, 0, App.Model.MaskAnimatedTarget.Bounds, 1, CanvasImageInterpolation.Linear, compositeMode); } if (App.Model.isMask == true)//蓝色选区 { App.Model.isReRender = true; App.Model.Refresh++; } }
public static void DrawImage(this CanvasDrawingSession t, ICanvasImage ii, CanvasComposite c, float o = 1) { var bb = ii.GetBounds(t.Device); t.DrawImage(ii, bb, bb, o, CanvasImageInterpolation.Linear, c); }