C#基于SkiaSharp實現印章管理(3)

??本系列第一篇文章中創建的基本框架限定了印章形狀為矩形,但常用的印章有方形、圓形等多種形狀,本文調整程序以支持定義并顯示矩形、圓角矩形、圓形、橢圓等4種形式的印章背景形狀。
??定義印章背景形狀枚舉類型,矩形、圓形、橢圓相關的尺寸能夠根據印章寬度、高度計算,但圓角矩形需額外增加圓角半徑尺寸,因此調整印章數據結構定義如下:

public enum BgType
{Rect=0,RoundRect=1,Circle=2,Oval=3
}public class SealInfo
{/// <summary>/// 印章名稱/// </summary>public string Name { get; set; }=string.Empty;/// <summary>/// 印章寬度/// </summary>public float Width { get; set; } = 0;/// <summary>/// 印章高度/// </summary>public float Height { get; set; } = 0;/// <summary>/// 尺寸單位類型,默認為毫米/// </summary>public UnitType UnitType { get; set; } = UnitType.Mm;/// <summary>/// 印章背景色,默認白色/// </summary>public SKColor BgColor {  get; set; }=SKColors.White;/// <summary>/// 背景形狀類型/// </summary>public BgType BgType { get; set; } = BgType.Rect;/// <summary>/// 圓角半徑/// </summary>public float CornerRadius { get; set; } = 0;/// <summary>/// 是否有邊框/// </summary>public bool HasBorder { get; set; } = false;/// <summary>/// 邊框寬度/// </summary>public float BorderWidth { get; set; } = 1;/// <summary>/// 邊框顏色/// </summary>public SKColor BorderColor { get;set; } = SKColors.Red;
}

??雖然SKPaint的Style 屬性可以設置同時繪制邊框和底色(值定義為StrokeAndFill),但還沒有在幫助文檔或其它文檔中看到邊框和底色不同顏色時的設置和繪制方式,因此只能采用比較笨的方式,先繪制底色再繪制邊框,同一個繪制函數調用兩次,兩次之間修改繪制方式和繪制顏色。采用SKPath對象保存不同類型的印章形狀,最終調用canvas.DrawPath函數統一繪制底色和邊框,主要代碼如下:

Func<float, int, float> unitConverter = m_currSeal.UnitType == UnitType.Pixel ? CommonFunction.Pixel2Pixel : CommonFunction.MM2Pixel; ;SKCanvas canvas = e.Surface.Canvas;canvas.Clear();SKPaint skPaint = new SKPaint();
skPaint.Style = SKPaintStyle.Fill;
skPaint.Color = m_currSeal.BgColor;float borderWidth = unitConverter(m_currSeal.BorderWidth, skBoard.DeviceDpi);
SKRect rect = new SKRect(borderWidth / 2, borderWidth / 2, unitConverter(m_currSeal.Width, skBoard.DeviceDpi) - borderWidth / 2, unitConverter(m_currSeal.Height, skBoard.DeviceDpi) - borderWidth / 2);SKPath path = new SKPath();switch (m_currSeal.BgType)
{case BgType.Rect:path.AddRect(rect);break;case BgType.RoundRect:path.AddRoundRect(new SKRoundRect(rect, unitConverter(m_currSeal.CornerRadius, skBoard.DeviceDpi)));break;case BgType.Circle:path.AddCircle(rect.MidX, rect.MidY, Math.Min(rect.Height / 2, rect.Width / 2));break;case BgType.Oval:path.AddOval(rect);break;
}canvas.DrawPath(path, skPaint);if(m_currSeal.HasBorder)
{skPaint.StrokeWidth = borderWidth;skPaint.Style = SKPaintStyle.Stroke;skPaint.Color = m_currSeal.BorderColor;canvas.DrawPath(path, skPaint);
}

??最后是程序運行效果,如下圖所示:
在這里插入圖片描述

參考文獻:
[1]https://learn.microsoft.com/zh-cn/dotnet/api/skiasharp?view=skiasharp-2.88

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

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

相關文章

mathcup大數據競賽論文中集成學習(或模型融合)的運用分析

ps: (模型融合和集成學習是兩個緊密相關但又有所區別的概念。集成學習是一種更廣泛的范式&#xff0c;而模型融合可以被視為集成學習的一種特殊形式或策略。) 1.集成學習原理 圖1 如圖1所示&#xff0c;集成學習是一種通過結合多個機器學習模型的預測來提高整體性能的策略。其…

全國今日油價查詢-全國今日油價查詢接口-API接口

關于油價的信息&#xff0c;以下是詳細的分點表示和歸納&#xff1a; 最新油價調整&#xff1a; 時間&#xff1a;2024年6月28日0時 調整內容&#xff1a;汽油價格上調210元/噸&#xff0c;柴油價格上調200元/噸。 漲幅&#xff1a;加油站油價上漲0.16元/升-0.20元/升。 具體油…

20240629在NanoPi R6C開發板的預編譯的Android12下使用iperf3測試網速

20240629在NanoPi R6C開發板的預編譯的Android12下使用iperf3測試網速 2024/6/29 11:11 【表揚一下】友善之臂沒有提供update.img的預編譯固件&#xff0c;我心里一涼&#xff0c;這么多IMG文件&#xff0c;得一個一個選擇呀&#xff01; 但是別人友善之臂特別急人之所急&#…

6.27-6.29 舊c語言

#include<stdio.h> struct stu {int num;float score;struct stu *next; }; void main() {struct stu a,b,c,*head;//靜態鏈表a.num 1;a.score 10;b.num 2;b.score 20;c.num 3;c.score 30;head &a;a.next &b;b.next &c;do{printf("%d,%5.1f\n&…

Flink 從入門到放棄

0 寫在前面 程序員闖蕩江湖的一生都在與數據打交道&#xff0c;初入江湖時基于 MySQL 的 CRUD&#xff0c;漸入佳境后利用 Redis 實現查詢加速及分布式控制&#xff0c;本質上都是數據處理&#xff1b;無論主動/被動&#xff0c;都在利用數據來達成業務/技術目的。自然而然的&a…

javaSE知識點整理總結(下)、MySQL數據庫

目錄 一、異常 1.常見異常類型 2.異常體系結構 3.異常處理 &#xff08;1&#xff09;finally &#xff08;2&#xff09;throws 二、JDBC 1.JDBC搭建 2.執行SQL語句兩種方法 三、MySQL數據庫 1.ddl 2.dml 3.dql &#xff08;1&#xff09;字符函數 &#xff08;…

Linux開發講課22---I2C讀寫 EEPROM 實驗(含代碼)

EEPROM 是一種掉電后數據不丟失的存儲器&#xff0c;常用來存儲一些配置信息&#xff0c;以便系統重新上電的時候加載之。 EEPOM 芯片最常用的通訊方式就是 I2C 協議&#xff0c;本小節以 EEPROM的讀寫實 驗為大家講解 STM32 的 I2C 使用方法。實驗中 STM32 的 I2C 外設采用主模…

防止它人代碼調試?分享 1 段優質 JS 代碼片段!

大家好&#xff0c;我是大澈&#xff01; 本文約 600 字&#xff0c;整篇閱讀約需 1 分鐘。 每日分享一段優質代碼片段。 今天分享一段 JS 代碼片段&#xff0c;是防止代碼被調試或篡改的基礎。 老規矩&#xff0c;先閱讀代碼片段并思考&#xff0c;再看代碼解析再思考&#…

如何輕松解決復雜文檔格式轉換問題

上周&#xff0c;我遇到了一個棘手的問題&#xff1a;需要將一大堆PDF文件轉換成可編輯的Word文檔&#xff0c;時間緊迫&#xff0c;手動轉換根本來不及。朋友推薦我使用了一個網站——xuelin.cc&#xff0c;這個網站不僅提供強大的AI對話功能&#xff0c;還能輕松完成各種文檔…

Hadoop3:Yarn框架的三種調度算法

一、概述 目前&#xff0c;Hadoop作業調度器主要有三種&#xff1a;FIFO、容量&#xff08;Capacity Scheduler&#xff09;和公平&#xff08;Fair Scheduler&#xff09;。Apache Hadoop3.1.3默認的資源調度器是Capacity Scheduler。 CDH框架默認調度器是Fair Scheduler。 …

改機軟件有哪些?實現一鍵新機、改串號、改IMEI和手機參數的需求 硬改手機軟件,新機環境模擬 設備偽裝,一鍵改機,一鍵復原

這次針對可以直接開端口修改參數的機型做一些工具解析 前面接觸合作過很多工作室。其中很多工作室對于各自軟件的跳驗證有各自的需求。 一個機型各項參數一般有IMEI WiFi 藍牙 sn psb ESN等等。 針對這些參數的修改首先要明白各自軟件檢測的具體是哪些參數來驗證。 對于常用…

#HDC2024 心得分享#主題演講學習-加入鴻蒙生態正當時

一、主題演講學習心得 通過本次主題演講的聆聽與學習&#xff0c;我們在猜出中和不太確定的相關內容紛紛呈現。比如鴻蒙內核與HarmonyOS Next獲得行業內最高等級的安全認證&#xff1b;盤古大模型、小藝智能體、意圖理解與分發框架等構筑的AI、AIGC能力對HarmonyOS Next及原生…

MySQL高級-索引-使用規則-覆蓋索引回表查詢

文章目錄 1、覆蓋索引1.1、查看索引1.2、刪除單列索引 idx_user_pro1.3、查詢 profession軟件工程 and age31 and status01.4、執行計劃 profession軟件工程 and age31 and status01.5、執行計劃 select id,profession,age,status1.6、執行計劃 select id,profession,age,statu…

Transformer教程之多頭自注意力機制

大家好&#xff0c;今天我們要聊一聊Transformer中的一個核心組件——多頭自注意力機制。無論你是AI領域的新手&#xff0c;還是深度學習的老鳥&#xff0c;這篇文章都會幫助你更深入地理解這個關鍵概念。我們會從基礎開始&#xff0c;逐步深入&#xff0c;最終讓你對多頭自注意…

軟考《信息系統運行管理員》-1.3信息系統運維的發展

1.3信息系統運維的發展 我國信息系統運維的發展總體現狀 呈現三個“二八現象” 從時間周期看&#xff08;開發流程&#xff09;從信息系統效益看&#xff08;消息體現為“用好”&#xff09;從資金投入看&#xff08;重開發&#xff0c;輕服務&#xff09; 信息系統運維的發…

Codeforces Beta Round 32 (Div. 2, Codeforces format) D. Constellation 題解 枚舉

Constellation 題目描述 A star map in Berland is a checked field n m nm nm squares. In each square there is or there is not a star. The favorite constellation of all Berland’s astronomers is the constellation of the Cross. This constellation can be for…

JAVA高級進階13單元測試、反射、注解

第十三天、單元測試、反射、注解 單元測試 介紹 單元測試 就是針對最小的功能單元(方法)&#xff0c;編寫測試代碼對其進行正確性測試 咱們之前是如何進行單元測試的&#xff1f; 有啥問題 &#xff1f; 只能在main方法編寫測試代碼&#xff0c;去調用其他方法進行測試。 …

頁面開發感想

頁面開發 1、 前端預覽 2、一些思路 2.1、首頁自定義element-plus的走馬燈 :deep(.el-carousel__arrow){border-radius: 0%;height: 10vh; }需要使用:deep(標簽)才能修改樣式 或者 ::v-deep 標簽 2.2、整體設計思路 <template><div class"card" style&…

【ChatBI】text2sql-不需要訪問數據表-超輕量Python庫Vanna快速上手,對接oneapi

oneapi 準備 首先確保你有oneapi &#xff0c;然后申請 kimi的api 需要去Moonshot AI - 開放平臺 然后添加一個api key 然后打開oneapi的渠道界面&#xff0c;添加kimi。 然后點擊 測試&#xff0c; 如果能生成響應時間&#xff0c;就是配置正確。 然后創建令牌 http:…

Vllm Offline 啟動

Vllm Offline 啟動 Vllm Offline 啟動&#xff0c;設置環境變量&#xff0c; TRANSFORMERS_OFFLINE1reference: https://github.com/vllm-project/vllm/discussions/1405