当前位置: 首页 > news >正文

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.lryc.cn/news/386690.html

相关文章:

  • 如何理解泛型的编译期检查
  • 计算机组成原理:海明校验
  • 信息学奥赛初赛天天练-39-CSP-J2021基础题-哈夫曼树、哈夫曼编码、贪心算法、满二叉树、完全二叉树、前中后缀表达式转换
  • 第11章 规划过程组(收集需求)
  • 探索WebKit的守护神:深入Web安全策略
  • unity ScrollRect裁剪ParticleSystem粒子
  • 凤仪亭 | 第7集 | 大丈夫生居天地之间,岂能郁郁久居人下 | 司徒一言,令我拨云见日,茅塞顿开 | 三国演义 | 逐鹿群雄
  • React实战学习(一)_棋盘设计
  • 【LeetCode】每日一题:三数之和
  • 逆风而行:提升逆商,让困难成为你前进的动力
  • 新能源汽车CAN总线故障定位与干扰排除的几个方法
  • 【涵子来信】——社交宝典:克服你心中的内向,世界总有缺陷
  • LabVIEW项目外协时选择公司与个人兼职的比较
  • 汽车电子工程师入门系列——CAN 规范系列通读
  • 泽众云真机-平台华为机型HarmonyOS NEXT系统已上线!
  • AI基础:从线性回归到梯度下降
  • AI产品经理面试
  • 二进制方式部署consul单机版
  • SpringBoot整合Quartz实现动态定时任务
  • qt 用宏控制静态接口的统一
  • pdf怎么转换成jpg,本地转换还是在线转换?
  • 【物联网】802.15.4简介
  • C++基础语法:复制构造函数,赋值构造函数及浅复制,深复制
  • 架构是怎样练成的-楼宇监控系统案例
  • valgrind使用浅谈
  • 强化学习专题:强化学习知识梳理(一)
  • 深入JVM:详解JIT即时编译器
  • ORBSLAM3_ROS_Ubuntu18_04环境搭建安装
  • 【opencv - C++ - Ubuntu】putText 显示中文最快方法
  • 百度网盘下载速度慢的解决办法