Exemple #1
0
        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();
            }
        }
Exemple #2
0
        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;//存在剪切板
        }
Exemple #3
0
        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;
            }
        }
Exemple #5
0
        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); //刷新缩略图
            }
        }
Exemple #6
0
        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(),
     };
 }
Exemple #9
0
 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;//存在剪切板
 }
Exemple #10
0
        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++;
            }
        }
Exemple #11
0
    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);
    }