C#基于SkiaSharp实现印章管理(1)

devtools/2024/12/22 13:11:35/

  最近对着微软的教程学习SkiaSharp的概念及用法,由于之前使用GDI+绘制过坐标系、印章等程序,准备使用SkiaSharp、SKControl控件编写简单的印章设计功能,并能用印章对图片盖章。本文实现创建印章背景、序列化及反序列化印章对象等功能。
  VS2022新建Winform项目,在Nuget包管理器中搜索并安装以下包:

SkiaSharp
SkiaSharp.Views
SkiaSharp.Views.Forms
SkiaSharp.Views.Forms.WPF

  印章一般是白底红边框,或者没有边框,本文暂不考虑印章内部的文字、线条、圆/椭圆等样式,定义以下类型保存印章的背景色、尺寸、边框颜色、边框宽度等信息。

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 bool HasBorder { get; set; } = false;/// <summary>/// 边框宽度/// </summary>public float BorderWidth { get; set; } = 1;/// <summary>/// 边框颜色/// </summary>public SKColor BorderColor { get;set; } = SKColors.Red;
}

  支持两种尺寸单位类型:毫米、像素。一般都是按毫米设置印章尺寸,因此绘制印章时需要从毫米转换到像素(SkiaSharp尺寸单位默认为像素,暂时没有看到设置其它计量单位的方式)。像素和毫米转换时需要用到控件的DPI,GDI+的Graphics对象中支持获取DpiX和DpiY,但是SKCanvas中没有DPI数据,而是保存在SKControl的DeviceDpi属性,且仅有单个属性,并未区分X和Y方向。
  同时关于SKColor和System.Drawing.Color之间的转换,SkiaSharp.Views.Desktop.Common程序集的扩展类中提供了扩展函数ToDrawingColor,支持将SKColor转换为System.Drawing.Color,而程序集System.Drawing.Primitives的ColorTranslator类的函数ToHtml支持将System.Drawing.Color转换为十六进制字符串,然后调用SKColor.Parse转换为SKColor实例,以下示例代码调用Winform的颜色选择组件设置背景颜色:

ColorDialog colorDialog = new ColorDialog();
colorDialog.Color = m_seal.BgColor.ToDrawingColor();
if (colorDialog.ShowDialog() == DialogResult.OK)
{//m_seal.BgColor = SKColor.Parse(String.Format("#{0:X2}{1:X2}{2:X2}", colorDialog.Color.R, colorDialog.Color.G, colorDialog.Color.B));m_seal.BgColor = SKColor.Parse(System.Drawing.ColorTranslator.ToHtml(colorDialog.Color));txtBgColor.Text = m_seal.BgColor.ToString();
}

  调用System.Text.Json.JsonSerializer序列化及反序列化SealInfo对象实例,下图是序列化结果,但是反序列化时SKColor对象的值没有正确获取,还不清楚问题原因。
在这里插入图片描述
  最后是主要绘图代码及程序运行效果:

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;canvas.DrawRect(0, 0, unitConverter(m_currSeal.Width, skBoard.DeviceDpi), unitConverter(m_currSeal.Height, skBoard.DeviceDpi), sKPaint);if(m_currSeal.HasBorder)
{sKPaint.Style = SKPaintStyle.Stroke;sKPaint.Color = m_currSeal.BorderColor;float borderWidth= unitConverter(m_currSeal.BorderWidth, skBoard.DeviceDpi);sKPaint.StrokeWidth= borderWidth;SKRect rect = new SKRect(borderWidth / 2, borderWidth / 2, unitConverter(m_currSeal.Width, skBoard.DeviceDpi) - borderWidth / 2, unitConverter(m_currSeal.Height, skBoard.DeviceDpi) - borderWidth / 2); canvas.DrawRect(rect, sKPaint);
}

在这里插入图片描述

在这里插入图片描述

参考文献:
[1]https://learn.microsoft.com/zh-cn/previous-versions/xamarin/xamarin-forms/user-interface/graphics/skiasharp/


http://www.ppmy.cn/devtools/55224.html

相关文章

GIM: Learning Generalizable Image Matcher From Internet Videos

【引用格式】&#xff1a;Shen X, Yin W, Mller M, et al. GIM: Learning Generalizable Image Matcher From Internet Videos[C]//The Twelfth International Conference on Learning Representations. 2023. 【网址】&#xff1a;https://arxiv.org/pdf/2402.11095 【开源代…

数据结构之B树

B树&#xff08;B-tree&#xff09;是一种自平衡的搜索树数据结构&#xff0c;它通过在内部节点中存储键值和指向子节点的指针来保持树的平衡。B树的设计使得它非常适合在磁盘I/O操作受限的环境中进行数据存储和检索&#xff0c;例如数据库和文件系统。 B树的特点包括&#xf…

学生课程信息管理系统

摘 要 目前&#xff0c;随着科学经济的不断发展&#xff0c;高校规模不断扩大&#xff0c;所招收的学生人数越来越 多&#xff1b;所开设的课程也越来越多。随之而来的是高校需要管理更多的事务。对于日益增 长的学生相关专业的课程也在不断增多&#xff0c;高校对其管理具有一…

HCIA 19 结束 企业总部-分支综合实验(下)

3.6出口NAT配置可以访问互联网 配置NAT使内网可以访问公网8.8.8.8&#xff0c;当前总部PC1 PING不通公网地址8.8.8.8。 3.6.1总部配置NAT访问互联网 步骤1&#xff1a;配置NAT acl number 2000 rule 5 permit source 192.168.0.0 0.0.255.255 # interface GigabitEthern…

Repair LED lights

Repair LED lights 修理LED灯&#xff0c;现在基本用灯带&#xff0c;就是小型LED灯串联一起的 1&#xff09;拆旧灯条&#xff0c;这个旧的是用螺丝拧的产品 电闸关掉。 2&#xff09;五金店买一个&#xff0c;这种是磁铁吸附的产品 现在好多都是铝线啊。。。 小部件&#x…

如何添加虚轴(AM400PLC)

1、添加虚轴 选择好后&#xff0c;选择点击添加。 2、虚轴循环周期任务 EtherCAT运动控制总线启用的时候&#xff0c;选择EtherCAT总线任务周期。

安装Cmakeffmpeglibssh

首先安装cmake&#xff1a; sudo apt install cmake cmake --version然后这个输出正常就装好了 然后安装ffmpeg: tar xvzf n4.4.tar.gz cd FFmpeg-n4.4 chmod x configure ./configure --enable-gpl --enable-nonfree --enable-libx264 --enable-debug --disable-opti…

如何配置node.js环境

文章目录 step1. 下载node.js安装包step2. 创建node_global, node_cache文件夹step3.配置node环境变量step3. cmd窗口检查安装的node和npm版本号step4. 设置缓存路径\全局安装路径\下载镜像step5. 测试配置的nodejs环境 step1. 下载node.js安装包 下载地址&#xff1a;node.js…