<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在新的Windows UWP程式中,引入了一個新的API庫: Win2D。它是一個d2d的封裝,可以直接使用C#來快速實現高效2D繪圖了。這個API雖然在Win8.1時代就開始著手開發了,但最近才完善了下來。本文這裡就簡單的介紹一下它的基本用法:
Win2D並不是Win10 SDK裡面的一部分,需要從Nuget上安裝,在程式包管理器裡直接安裝Win2D.uwp即可。
PM> Install-Package Win2D.uwp
這個是Win10下的庫,Win8下需要使用Win2D.win81庫。安裝完後在Project.json中可以看到相應的庫依賴:
Win2D引入了一個新的畫布:Microsoft.Graphics.Canvas.UI.Xaml.CanvasControl
,所有的繪製必須在它上面進行。因此首先在XAML中新增CanvasControl作為底圖:
xmlns:canvas="using:Microsoft.Graphics.Canvas.UI.Xaml" <Grid> <canvas:CanvasControl Draw="canvasControl_Draw" ClearColor="CornflowerBlue" /> </Grid>
然後響應其Draw事件,在裡面新增繪製動作:
void canvasControl_Draw(CanvasControl sender, CanvasDrawEventArgs args) { args.DrawingSession.DrawEllipse(155, 115, 80, 30, Colors.Black, 3); args.DrawingSession.DrawText("Hello, world!", 100, 100, Colors.Yellow); }
執行效果如下:
這種方式與WinForm和WPF中的自繪製比較像,只是一些API有些差異。
前面使用了DrawingSesion下發繪製命令,和WPF中的DrawingContext差不多,就是一個繪製上下文。它主要的命令分為如下兩種:DrawXXX和FillXXX。DrawXXX只是繪製影象,而FillXXX只填充影象,這裡和WPF那種繪製和填充在一個API裡的方式稍稍有點不同。
由於API並不多,這裡列舉了一下,基本上看著就知道怎麼用了。
DrawCircle
DrawCachedGeometry
DrawEllipse
DrawGeometry
DrawImage
DrawInk
DrawLine
DrawRectangle
DrawRoundedRectangle
DrawText。
DrawTextLayout
FillCircle
FillEllipse
FillGeometry
FillRectangle
FillRoundedRectangle
它的API還比較簡單,基本上看著就知道怎麼用,不過其中的DrawImage能傳入一個IcanvasImage型別,而這個型別並不僅僅是圖片,包括下面介紹的CanvasCommandList和Effect都是這種型別,使用的時候需要熟悉一下。
2D繪圖的過程中往往還伴隨著一些平移,旋轉等2D轉換的操作,DrawingSession中提供了一個Transform屬性可以傳入一個3*2矩陣實現2D轉換。
var ds = args.DrawingSession; ds.Transform = Matrix3x2.CreateTranslation(new Vector2(200, 100)); ds.DrawText("A", 0, 0, Colors.White); ds.Transform *= Matrix3x2.CreateRotation(12, new Vector2(200,80)); ds.DrawText("B", 0, 0, Colors.White);
CanvasCommandList可以快取一組繪製命令,然後統一繪製。它可以用於分塊繪製,也可以用於減少重複繪製。
var renderTarget = new CanvasCommandList(sender); using (var clds = renderTarget.CreateDrawingSession()) { clds.DrawEllipse(155, 115, 80, 30, Colors.Black, 3); clds.DrawText("Hello, world!", 100, 100, Colors.Yellow); } args.DrawingSession.DrawImage(renderTarget);
Win2D的一個比較給力的特性就是支援濾鏡特效,用它可以非常方便的實現常用的模糊、陰影等效果,這裡以高斯模糊為例修改下上面的效果。
var cmdList = new CanvasCommandList(sender); using (var clds = cmdList.CreateDrawingSession()) { clds.DrawEllipse(155, 115, 80, 30, Colors.Black, 3); clds.DrawText("Hello, world!", 100, 100, Colors.Yellow); } var effect = new GaussianBlurEffect(); effect.Source = cmdList; args.DrawingSession.DrawImage(effect);
系統還內建了許多常用的濾鏡效果,它們都以Effect結尾,放在Microsoft.Graphics.Canvas.Effects名稱空間下。
除了前面用到的繪製的時候觸發繪製操作的Draw事件外,還有一個比較常用的事件CreateResource,它在最開始載入控制元件的時候觸發,往往用於初始化各種資源。
另外再來看看Draw事件的觸發條件,它基本上和WPF的OnRender差不多,也就是說,一般在初次載入時會觸發,改變視窗大小的時候會觸發,拖動視窗時不會觸發。如果要在後臺控制其重繪也比較簡單,但用其Invalidate方法即可。
到此這篇關於C#使用Win2D在UWP程式中實現2D繪圖的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45