.NET跨平臺繪圖基礎庫--SkiaSharp

张善友發表於2024-09-28

SkiaSharp 是一個跨平臺的 2D 圖形 API,用於 .NET 平臺,基於 Google 的 Skia 圖形庫。它提供了全面的 2D API,可以在移動、伺服器和桌面模型上渲染影像。SkiaSharp 可以在多個 .NET 平臺上使用,包括 ASP.NET Core、WPF、Winform、MAUI、AvaloniaUI 和 Uno。

Skia是個2D向量圖形處理函式庫,包含字型、座標轉換,以及點陣圖都有高效能且簡潔的表現。不僅用於Google Chrome瀏覽器, Android開放手機平臺也採用Skia作為繪圖處理,搭配OpenGL/ES與特定的硬體特徵,強化顯示的效果

自2005年Skia被Google收購後,一直相當神秘低調,直到2007年初,Skia GL相關的原始碼才被揭露,作為Google Android平臺的圖形引擎,稍後的Google Chrome瀏覽器也採用Skia引擎。隨著Android與Chrome (開源版本稱為"Chromium")兩大平臺公佈原始碼後,skia也一併公開原始碼,以Apache License v2釋出(注意,這意味著與GPLv2授權不相容) ,而Android與Chrome的程式碼庫中都有一份[skia]的複製,因需求不同,做了部份的修改,比方說Chrome專案底下的 [chrome/trunk/src/skia],需要注意的是,Skia本身是不涉及底層環境,如Linux Framebuffer或Gtk+銜接的處理,這也是何以Android (透過Linux Framebuffer)與Chrome (開發中的Linux版本使用Gtk+)需要提供一份修改,以便系統接軌。

SkiaSharp是一個強大跨平臺繪圖框架,可以用SkiaSharp在WPF、安卓Xamarin.Forms客戶端繪圖,也可以用於建立PDF繪圖,但是由於它不支援網頁繪圖,所以總覺得很遺憾,因為目前主流的瀏覽器都是谷歌Chrom核心,谷歌為什麼不支援自家的Skia在網頁直接繪圖呢?如果SkiaSharp可以直接在網頁繪圖(Blazor webassembly),那它就是跨越全平臺的繪圖框架了。終於到了2021年10月12日,.NET 6釋出RC2候選版本(正式釋出前最後一版),宣佈了一個突破性的技術:支援在Web網頁上採用SkiaSharp畫布繪圖。這是.NET跨平臺技術發展的一個創舉,使用C#可以直接在網頁畫布上繪圖,打破了JavaScript+canvas的長期壟斷地位。C#是強型別語言,可以無縫對接從服務端獲取的結構化資料,有效提高開發效率和質量。

ASP.NET Core updates in .NET 6 Release Candidate 2 - ASP.NET Blog (microsoft.com)

SkiaSharp is a cross-platform 2D graphics library for .NET based on the native Skia graphics library, and it now has preview support for Blazor WebAssembly. Let’s give it a try!

在 MAUI 中,SkiaSharp 是透過 Microsoft.Maui.Graphics 庫使用的。Microsoft.Maui.Graphics 是一個跨平臺的圖形庫,它使用 SkiaSharp 作為底層渲染引擎來提供一致的 API 訪問本機圖形功能。這意味著開發者可以在 MAUI 應用中使用 SkiaSharp 來繪製形狀、文字和儲存影像。此外,SkiaSharp 還可以用於建立自定義控制元件,例如在 MAUI 中繪製可定製顏色和角度的輪盤或圓餅圖。

對於 Uno 平臺,SkiaSharp 也可以整合到 Uno 中。開發者可以透過新增 NuGet 包 "SkiaSharp" 到共享類庫,並在 XAML 中新增 SkXamlCanvas 控制元件來使用 SkiaSharp。然而,有時可能會遇到編譯問題,需要確保找到正確的名稱空間。

AvaloniaUI 預設使用 Skia 渲染引擎,這是因為 AvaloniaUI 的架構設計中包含了 SkiaSharp,為了提高圖形渲染效能,AvaloniaUI 在其合成渲染器中增強了圖形渲染能力,並且引入了 GPU 互操作功能,這使得 Avalonia 能夠與 GPU 更高效地工作,從而提高渲染效能和視覺效果,然而,需要注意的是,AvaloniaUI 使用的 Skia 是一個有限的 Skia 子集,用於 Avalonia 執行所必需的功能,不包括影像處理、影像後設資料和影像解碼等功能。對於需要多用途影像處理的開發者來說,SkiaSharp 是更好的選擇。在使用 SkiaSharp 3.0 時,開發者需要手動包含目標平臺的 NativeAssets 包.

SkiaSharp 在 MAUI、AvaloniaUI 和 Uno 中都有廣泛應用,並且透過 Microsoft.Maui.Graphics 提供了一致的跨平臺圖形渲染能力。在不同的 .NET 平臺(如 MAUI、AvaloniaUI 和 Uno)中都提供了高效能的圖形渲染能力,但在移動裝置上可能需要額外的最佳化以避免效能問題。SkiaSharp 的效能表現如下:

  1. AvaloniaUI:Avalonia 使用 SkiaSharp 作為其渲染引擎,能夠實現高效能的圖形渲染,並在不同作業系統上實現一致的使用者介面。然而,有觀點認為 Avalonia 由於基於 Skia,可能會在移動裝置上遇到效能問題。

  2. MAUI:在 MAUI 中,Microsoft.Maui.Graphics 和 SkiaSharp 都是重要的庫,它們為開發者提供了強大的圖形繪製能力。MAUI 專為提高效能而設計,透過在原生平臺控制元件上實現一種精簡的、解耦的處理程式對映器模式,減少了 UI 渲染中的開銷。

  3. Uno:SkiaSharp 與 Uno Platform 的比較中,SkiaSharp 被描述為一個跨平臺的 2D 圖形 API,適用於 .NET 平臺,提供了全面的 2D API,可以用於移動、伺服器和桌面模型來渲染影像。

應用場景上來說,它適用於多種應用場景,包括但不限於:

  • 繪圖工具:SkiaSharp 可以用於開發各種繪圖工具,如富文字編輯器、影像繪製工具等。例如,可以使用 SkiaSharp 建立一個功能強大的繪圖工具,支援複雜的圖形繪製和編輯功能。

  • 報表製作:在報表開發中,SkiaSharp 可以用於生成高質量的報表影像,支援多種資料格式和佈局需求。

  • 影像生成:SkiaSharp 可以用於生成各種影像,如驗證碼、二維碼等。例如,可以使用 SkiaSharp 生成用於身份驗證的二維碼。

  • 使用者介面繪製:在使用者介面設計中,SkiaSharp 可以用於繪製複雜的圖形和動畫效果。例如,可以使用 SkiaSharp 在 WPF 應用程式中實現自繪的彈動小球、粒子花園等特效。

  • 遊戲開發:SkiaSharp 可以用於開發簡單的遊戲,如投籃小遊戲,透過自繪實現遊戲中的動畫和互動效果。

  • PDF 繪圖:SkiaSharp 還可以在 PDF 上進行繪圖,支援在多種平臺上生成 PDF 檔案中的圖形內容。

  • 跨平臺應用:由於 SkiaSharp 是跨平臺的,因此可以在 Windows、Linux、Android、iOS 等多個平臺上使用,支援在不同裝置上渲染影像和圖形。

  • 開源專案:SkiaSharp 被廣泛應用於各種開源專案中,如 Kimono 設計器,支援以圖形化的方式建立二維圖片,並生成跨平臺的程式碼

相關文章