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

2024-06-23 23:20

本文主要是介绍C#基于SkiaSharp实现印章管理(1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  最近对着微软的教程学习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/

这篇关于C#基于SkiaSharp实现印章管理(1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1088566

相关文章

在macOS上安装jenv管理JDK版本的详细步骤

《在macOS上安装jenv管理JDK版本的详细步骤》jEnv是一个命令行工具,正如它的官网所宣称的那样,它是来让你忘记怎么配置JAVA_HOME环境变量的神队友,:本文主要介绍在macOS上安装... 目录前言安装 jenv添加 JDK 版本到 jenv切换 JDK 版本总结前言China编程在开发 Java

Spring Boot Actuator应用监控与管理的详细步骤

《SpringBootActuator应用监控与管理的详细步骤》SpringBootActuator是SpringBoot的监控工具,提供健康检查、性能指标、日志管理等核心功能,支持自定义和扩展端... 目录一、 Spring Boot Actuator 概述二、 集成 Spring Boot Actuat

Python实现批量提取BLF文件时间戳

《Python实现批量提取BLF文件时间戳》BLF(BinaryLoggingFormat)作为Vector公司推出的CAN总线数据记录格式,被广泛用于存储车辆通信数据,本文将使用Python轻松提取... 目录一、为什么需要批量处理 BLF 文件二、核心代码解析:从文件遍历到数据导出1. 环境准备与依赖库

linux下shell脚本启动jar包实现过程

《linux下shell脚本启动jar包实现过程》确保APP_NAME和LOG_FILE位于目录内,首次启动前需手动创建log文件夹,否则报错,此为个人经验,供参考,欢迎支持脚本之家... 目录linux下shell脚本启动jar包样例1样例2总结linux下shell脚本启动jar包样例1#!/bin

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

Python实现PDF按页分割的技术指南

《Python实现PDF按页分割的技术指南》PDF文件处理是日常工作中的常见需求,特别是当我们需要将大型PDF文档拆分为多个部分时,下面我们就来看看如何使用Python创建一个灵活的PDF分割工具吧... 目录需求分析技术方案工具选择安装依赖完整代码实现使用说明基本用法示例命令输出示例技术亮点实际应用场景扩

MySQL多实例管理如何在一台主机上运行多个mysql

《MySQL多实例管理如何在一台主机上运行多个mysql》文章详解了在Linux主机上通过二进制方式安装MySQL多实例的步骤,涵盖端口配置、数据目录准备、初始化与启动流程,以及排错方法,适用于构建读... 目录一、什么是mysql多实例二、二进制方式安装MySQL1.获取二进制代码包2.安装基础依赖3.清

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使