【SkiaSharp繪圖11】SKCanvas屬性詳解

文章目錄

  • SKCanvas
  • 構造SKCanvas
    • 構造光柵 Surface
    • 構造GPU Surface
    • 構造PDF文檔
    • 構造XPS文檔
    • 構造SVG文檔
    • SKNoDrawCanvas
  • 變換
  • 剪裁和狀態
  • 構造函數
  • 相關屬性
    • DeviceClipBounds獲取裁切邊界(設備坐標系)
    • ClipRect修改裁切區域
    • IsClipEmpty當前裁切區域是否為空
    • IsClipRect裁切區域是否為矩形
    • LocalClipBounds獲取裁切邊界(本地坐標系)
    • SaveCount 狀態記數
    • TotalMatrix 變換矩陣
    • 示例

SKCanvas

用于在位圖、表面或其他繪圖設備上執行 2D 圖形操作。

  1. 繪圖操作

    • SKCanvas 提供了豐富的繪圖方法,如繪制幾何圖形(圓形、矩形、路徑等)、文本、位圖等。
    • 可以設置畫筆(SKPaint)的顏色、樣式、線寬等屬性,實現各種繪制效果。
  2. 圖像合成和組合

    • 可以將多個繪圖操作合成為單個圖像,支持透明度和混合模式,實現復雜的圖形效果。
    • 支持在不同圖層上進行繪制,并可以進行圖層的合并和組合。
  3. 處理和轉換

    • 支持坐標變換(平移、旋轉、縮放等),方便實現復雜的圖形變換和動畫效果。
    • 可以通過剪切區域(ClipRectClipPath)限制繪制區域,優化繪制性能。
  4. 跨平臺支持

    • SkiaSharp 是跨平臺的,可以在 Windows、macOS、Linux 和移動平臺(Android、iOS)上使用,SKCanvas 提供了統一的繪圖 API。
  5. 高性能渲染

    • SkiaSharp 使用 GPU 加速和多線程優化,能夠高效地處理大規模的圖形渲染和復雜的圖形操作。

構造SKCanvas

構造光柵 Surface

光柵后端繪制到內存塊。該內存可由SkiaSharp或客戶端自行管理。
默認推薦使用管理繪制畫布命令的內存的對象SKSurface。
OnPaintSurface(object sender, SkiaSharp.Views.Desktop.SKPaintGLSurfaceEventArgs e)事件中e參數的Surface就是SKSurface對象。
可通過SKSurface.Create方法的不同參數創建由SkiaSharp或自行管理內存的SKSurface對象。

  1. 由SkiaSharp管理
var canvas = e.Surface.Canvas;
canvas.Clear(SKColors.White);var info = new SKImageInfo(400, 300);
//通過SKSurface獲取Canvas
using (var skSurface = SKSurface.Create(info))
using (var skCanvas = skSurface.Canvas)
using (var skPaint = new SKPaint())
{skPaint.TextSize = 18;skPaint.Color = SKColors.LightGreen;skPaint.IsStroke = true;skCanvas.DrawRect(100, 100, 250, 100, skPaint);skCanvas.DrawText($"SKSurface1", 0, 200, skPaint);canvas.DrawSurface(skSurface, 0, 0, skPaint);
}
  1. 自動分配內存
var info2 = new SKImageInfo(400, 400);
//自行分配內存
var memory = Marshal.AllocCoTaskMem(info2.BytesSize);try
{using (var surface2 = SKSurface.Create(info2, memory, info2.RowBytes))using (var canvas2 = surface2.Canvas)using (var paint = new SKPaint()){paint.Color = SKColors.Blue;paint.TextSize = 18;canvas2.DrawCircle(200, 200, 100, paint);canvas2.DrawText($"SKSurface2", 0, 200, paint);canvas.DrawSurface(surface2, 0, 350, paint);}
}
finally
{Marshal.FreeCoTaskMem(memory);
}

SKSurface.Create
在測試的過程,一開始不知為什么會出現兩個矩形,還以為是SkiaSharp的BUG,后不知怎么搞的,又沒事了…

構造GPU Surface

GPU Surface必須有一個GRContext對象來管理GPU上下文以及紋理和字體的相關緩存。
GRContext對象與OpenGL上下文或Vulkan設備一一匹配。
如果使用SKGLControl控件,默認的的e.Surface.Context就是啟用了GPU的OpenGL

構造PDF文檔

使用SkiaSharp直接繪制并生成PDF文檔(不支持顯示PDF)
PDF后端使用SKDocument而不是SKSurface,因為文檔必須包含多個頁面。

var canvas = e.Surface.Canvas;
canvas.Clear(SKColors.White);using (FileStream stream = new FileStream(@"Images\test.pdf", FileMode.CreateNew, FileAccess.Write))
using (var doc = SKDocument.CreatePdf(stream, 72))
using (var pdfCanvas = doc.BeginPage(600, 800))
using (var paint = new SKPaint())
{paint.Color = SKColors.LightGreen;paint.IsAntialias = true;paint.TextSize = 24;pdfCanvas.DrawText("Create PDF Doc by SkiaSharp", 20, 30, paint);pdfCanvas.DrawCircle(300, 400, 150, paint);doc.EndPage();doc.Close();
}
  1. 創建一個寫的文件流
  2. 根據文件流和DPI創建SKDocument對象
  3. 根據SKDocument對象創建SKCanvas
  4. 可以SKCanvas繪制內容,生成PDF。

SKDocument.CreatePdf

構造XPS文檔

與構造Pdf類似,用SKDocument.CreateXps

var canvas = e.Surface.Canvas;
canvas.Clear(SKColors.White);using (FileStream stream = new FileStream(@"Images\test.xps", FileMode.Create, FileAccess.Write))
using (var doc = SKDocument.CreatePdf(stream, 72))
using (var pdfCanvas = doc.BeginPage(600, 800))
using (var paint = new SKPaint())
{paint.Color = SKColors.LightGreen;paint.IsAntialias = true;paint.TextSize = 24;pdfCanvas.DrawText("Create XPS doc by SkiaSharp", 20, 30, paint);pdfCanvas.DrawCircle(300, 400, 150, paint);doc.EndPage();doc.Close();
}

在這里插入圖片描述

構造SVG文檔

使用SKSvgCanvas構造SVG文檔。

using (FileStream stream = new FileStream(@"Images\test.svg", FileMode.Create, FileAccess.Write))
using (var svgCanvas = SKSvgCanvas.Create(new SKRect(0, 0, 600, 800), stream))
using (var paint = new SKPaint())
{paint.Color = SKColors.LightGreen;paint.IsAntialias = true;paint.TextSize = 24;svgCanvas.DrawText("Create SVG doc by SkiaSharp", 20, 30, paint);svgCanvas.DrawCircle(300, 400, 150, paint);
}

SKSvgCanvas.Create

SKNoDrawCanvas

構造不繪制的畫布,是提供一個“無操作”的畫布,這意味著它不會進行任何實際的繪圖操作。一般用于性能測試、繪圖命令的記錄與分析、避免不必要的繪圖。

變換

SKCanvas提供Scale、Skew、Translate、RotateDegrees、RotateRadians等常用的二維變換。
還可以使用SetMatrix指定變換矩陣。
使用ResetMatrix可重置矩陣狀態。

剪裁和狀態

可使用變換矩陣的Save方法來保存當前變換狀態,然后使用Restore或RestoreToCount方法恢復以前的狀態。還有SaveLayer方法。

構造函數

public SKCanvas (SkiaSharp.SKBitmap bitmap);

創建一個畫布,其中包含要繪制的指定位圖。

相關屬性

DeviceClipBounds獲取裁切邊界(設備坐標系)

public SkiaSharp.SKRectI DeviceClipBounds { get; }

獲取當前裁切邊界(在設備坐標中)。

ClipRect修改裁切區域

public void ClipRect (SkiaSharp.SKRect rect, SkiaSharp.SKClipOperation operation = SkiaSharp.SKClipOperation.Intersect, bool antialias = false);

修改當前裁切區域

IsClipEmpty當前裁切區域是否為空

public bool IsClipEmpty { get; }

判斷當前裁切區域是否為空。

IsClipRect裁切區域是否為矩形

public bool IsClipRect { get; }

判斷當前裁切區域是否為矩形。

LocalClipBounds獲取裁切邊界(本地坐標系)

public SkiaSharp.SKRect LocalClipBounds { get; }

獲取當前的裁切邊界(本地坐標系中,矩陣變換后的)

SaveCount 狀態記數

public int SaveCount { get; }

獲取畫布私有堆棧上的矩陣/裁切狀態的數量。
當調用SKCanvas對象的Save()方法時,加1。調用Restore()時,減1。
一個新的畫布的SaveCount為1。

TotalMatrix 變換矩陣

public SkiaSharp.SKMatrix TotalMatrix { get; }

獲取當前畫布的變換矩陣。

示例

var canvas = e.Surface.Canvas;
canvas.Clear(SKColors.White);
using (var paint = new SKPaint())
{paint.Color = SKColors.Red;paint.IsAntialias = true;paint.TextSize = 24;var yOffset = 50F;if (canvas.GetDeviceClipBounds(out var rect)){canvas.DrawText($"DeviceClipBounds:{rect}", 20, yOffset, paint);}yOffset += paint.FontSpacing;rect = new SKRectI(25, 20, 800, 800);//設置裁切區域canvas.ClipRect(rect);canvas.DrawText($"ClipRect:{rect}", 20, yOffset, paint);yOffset += paint.FontSpacing;if (canvas.GetDeviceClipBounds(out rect)){canvas.DrawText($"DeviceClipBounds:{rect}", 20, yOffset, paint);yOffset += paint.FontSpacing;}canvas.DrawText($"IsClipEmpty:{canvas.IsClipEmpty}", 50, yOffset, paint);yOffset += paint.FontSpacing;canvas.DrawText($"IsClipRect:{canvas.IsClipRect}", 50, yOffset, paint);yOffset += paint.FontSpacing;rect = SKRectI.Create(100, 50);canvas.DrawText($"ClipRect:{rect} Difference", 50, yOffset, paint);yOffset += paint.FontSpacing;canvas.ClipRect(rect, SKClipOperation.Difference);canvas.DrawText($"IsClipRect:{canvas.IsClipRect}", 50, yOffset, paint);yOffset += paint.FontSpacing;canvas.DrawText($"LocalClipBounds:{canvas.LocalClipBounds}", 50, yOffset, paint);yOffset += paint.FontSpacing;// 設置畫布變換(如平移)canvas.Translate(50, 50);canvas.DrawText($"Translate(50, 50)", 50, yOffset, paint);yOffset += paint.FontSpacing;canvas.DrawText($"LocalClipBounds:{canvas.LocalClipBounds}", 50, yOffset, paint);yOffset += paint.FontSpacing;if (canvas.GetDeviceClipBounds(out rect)){canvas.DrawText($"DeviceClipBounds:{rect}", 50, yOffset, paint);yOffset += paint.FontSpacing;}canvas.DrawText($"SaveCount:{canvas.SaveCount}", 50, yOffset, paint);yOffset += paint.FontSpacing;canvas.Save();canvas.DrawText($"Call Save()", 50, yOffset, paint);yOffset += paint.FontSpacing;canvas.DrawText($"SaveCount:{canvas.SaveCount}", 50, yOffset, paint);yOffset += paint.FontSpacing;canvas.Restore();canvas.DrawText($"Call Restore()", 50, yOffset, paint);yOffset += paint.FontSpacing;canvas.DrawText($"SaveCount:{canvas.SaveCount}", 50, yOffset, paint);yOffset += paint.FontSpacing;using (var newCanvas = new SKCanvas(new SKBitmap())){canvas.DrawText($"new SKCanvas SaveCount:{newCanvas.SaveCount}", 50, yOffset, paint);yOffset += paint.FontSpacing;}var matrix = canvas.TotalMatrix;canvas.DrawText($"TotalMatrix:{string.Join(",",matrix.Values)}", 50, yOffset, paint);yOffset += paint.FontSpacing;
}

SKCanvas屬性

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/35888.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/35888.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/35888.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JFreeChart 生成Word圖表

文章目錄 1 思路1.1 概述1.2 支持的圖表類型1.3 特性 2 準備模板3 導入依賴4 圖表生成工具類 ChartWithChineseExample步驟 1: 準備字體文件步驟 2: 注冊字體到FontFactory步驟 3: 設置圖表具體位置的字體柱狀圖:餅圖:折線圖:完整代碼&#x…

【QT】Svg圖標

目錄 SVGQT繪制SVG流程 SVG 一般而言,QSS是無法直接使用svg圖像的。 那如何才能顯示svg呢?我們知道svg的好處有很多,如矢量圖,體積小等等 svg本來就是一個document(可參考12),QT提供了QSvgRend…

二叉樹深度優先搜索(非遞歸實現,迭代法)

目錄 為什么可以用迭代法實現二叉樹的前后中序遍歷? 前序遍歷 后序遍歷 中序遍歷 為什么可以用迭代法實現二叉樹的前后中序遍歷? 因為遞歸的實現本質是,每次遞歸調用都會把函數的局部變量、參數值和返回地址等壓入調用棧中,然…

web期末作業設計網頁

設計一個網頁作為期末作業是一個很好的機會來展示你的前端開發技能。以下是一些步驟和建議,幫助你完成這個項目: 1. 確定網頁主題和目的 決定你的網頁是關于什么的(例如:個人博客、在線商店、公司網站、信息發布平臺等&#xff…

國產車規MCU OTA方案總結

目錄 1. 旗芯微FC4150 OTA 2. 云途YTM32B1MD OTA 3.小結 今天沒有廢話,啪一下很快,把目前接觸到的國內帶eFlash的車規MCU硬件OTA方案做一個梳理。 1. 旗芯微FC4150 OTA 旗芯微FC4150是基于ARM Cortex(快去審核下官網介紹,少了個T)-M4F內…

入門者必看-Ansible:自動化運維的利器

1. 引言 在當今快速變化的IT環境中,自動化成為了提升工作效率和確保系統一致性的重要手段。Ansible作為一個開源的自動化工具,因其簡單易用、功能強大而廣受歡迎。本文將深入探討Ansible的概念、架構、體系結構、搭建過程、常用操作方式以及使用場景&…

openGauss Developer Day 2024丨MogDB實現數據庫技術跨越,Ustore引擎革新存儲新境界

openGauss Developer Day 2024 6月21日,openGauss Developer Day 2024在北京昆泰嘉瑞文化中心成功召開。大會聚集學術專家、行業用戶、合作伙伴和開發者,共同探討數據庫面向多場景的技術創新,分享基于 openGauss 的行業聯合創新成果及實踐案例…

探索PHP中的魔術常量

PHP中的魔術常量(Magic Constants)是一些特殊的預定義常量,它們在不同的上下文中具有不同的值。這些常量可以幫助開發者獲取文件路徑、行號、函數名等信息,從而方便調試和日志記錄。本文將詳細介紹PHP中的魔術常量,幫助…

web前端——javaScript

目錄 一、javaScript概述 1.javaScript歷史 2.JavaScript與html,css關系 二、基本語法 ①放在head中 ②放在 body中 ③寫在外部的.js文件中 1.變量 2.數據類型 3.算術運算符 4.邏輯運算符 5.賦值運算 6.邏輯運算符 7.條件運算符 8.控制語句 三、函數 1…

智能掃地機器人環境感知與地圖構建優化方案

以下是一個針對智能掃地機器人程序中環境感知與地圖構建問題的具體解決方案,參考了之前文章中的相關技術和信息: 智能掃地機器人環境感知與地圖構建優化方案 一、引入高精度傳感器 激光雷達(LiDAR):使用高精度激光雷達…

模板語法輪播

1.常用的視圖容器組件 view類似于div進行使用 <div></div><view></view> scroll-view實現滾動列表效果 <scroll-view scroll-y> <view></view> <view></view> <view></view> </scroll-view> …

數據庫死鎖解決

一、Oracle死鎖查看和解決辦法匯總 由于生產的tomcat 經常有假死問題&#xff0c;困擾很久&#xff0c;最后發現有死鎖&#xff0c;解決辦法分享 1.1、查看死鎖 1.1.1、用dba用戶執行以下語句 select username,lockwait,status,machine,program from v$session where sid in …

Arduino - 按鈕 - 長按短按

Arduino - Button - Long Press Short Press Arduino - 按鈕 - 長按短按 Arduino - Button - Long Press Short Press We will learn: 我們將學習&#xff1a; How to detect the button’s short press 如何檢測按鈕的短按How to detect the button’s long press 如何檢測…

重大進展!微信支付收款碼全場景接入銀聯網絡

據中國銀聯6月19日消息&#xff0c;近日&#xff0c;銀聯網絡迎來微信支付收款碼場景的全面接入&#xff0c;推動條碼支付互聯互通取得新進展&#xff0c;為境內外廣大消費者提供更多支付選擇、更好支付體驗。 2024年6月&#xff0c;伴隨微信支付經營收款碼的開放&#xff0c;微…

Docker部署Nginx+Keepalived

# 創建掛載路徑 mkdir /data/nginx_keep/nginx/conf -p mkdir /data/nginx_keep/keepalived/vim nginx.conf user nginx; worker_processes auto;error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;events {worker_connections 1024; }http {incl…

Rust: duckdb和polars讀csv文件比較

一、文件準備 樣本內容&#xff0c;N行9列的csv標準格式&#xff0c;有字符串&#xff0c;有浮點數&#xff0c;有整型。 有兩個csv文件&#xff0c;一個大約是2.1萬行&#xff1b;一個是64萬行。 二、toml文件 [package] name "my_duckdb" version "0.1.0&…

opencv簡單小項目

OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一個開源的計算機視覺和機器學習軟件庫&#xff0c;它提供了大量的圖像和視頻處理功能。使用OpenCV可以開發各種簡單的小項目&#xff0c;例如&#xff1a; 圖像基本操作&#xff1a; 讀取和顯示圖像。調整…

弱監督學習

弱監督學習&#xff08;Weak Supervision&#xff09;是一種利用不完全、不精確或噪聲數據進行模型訓練的方法。以下是一些常用的弱監督方法及其原理&#xff1a; 1. 數據增強&#xff08;Data Augmentation&#xff09; 原理&#xff1a; 數據增強是一種通過增加訓練數據的多…

區塊鏈的歷史和發展:從比特幣到以太坊

想象一下&#xff0c;你住在一個小鎮上&#xff0c;每個人都有一個大賬本&#xff0c;記錄著所有的交易。這個賬本很神奇&#xff0c;每當有人買賣東西&#xff0c;大家都會在自己的賬本上記一筆&#xff0c;確保每個人的賬本都是一致的。這就是區塊鏈的基本思想。而區塊鏈的故…

HG/T 5838-2021金屬骨架發泡橡膠復合密封板檢測

金屬骨架發泡橡膠復合密封板是指工作溫度范圍-40&#xff5e;140℃&#xff0c;峰值溫度為150℃條件下使用的金屬骨架發泡密封板。 HG/T 5838-2021金屬骨架發泡橡膠復合密封板檢測項目&#xff1a; 測試項目 測試標準 外觀 HG/T 5838 厚度 HG/T 5838 壓縮性能 GB/T 206…