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

embedded/2024/9/25 1:48:29/

  印章中的文本主要分为两种:1)从左向右水平绘制的文本;2)沿指定路径绘制的文本。前者使用SKCanvas的DrawText绘制文本,后者则使用SKCanvas的DrawTextOnPath绘制文本。
  针对上述情况,调整SealElement类型定义,增加绘制文本所需的属性,主要增加以下属性。路径形状主要是矩形、圆形和椭圆,使用SealElement类的StartPoint、EndPoint属性记录形状位置和尺寸信息。

public class SealElement
{....../// <summary>/// 文本内容/// </summary>public string Content { get; set; } = string.Empty;/// <summary>/// 字体名称/// </summary>public string FontName { get; set; } = "宋体";/// <summary>/// 字体大小/// </summary>public float FontSize { get; set; } = 12;/// <summary>/// 字体颜色/// </summary>public SKColor FontColor { get; set; } = SKColors.Red;/// <summary>/// 文本是否加粗/// </summary>public bool IsBoldFont { get;set; } = false;/// <summary>/// 文本起始位置/// </summary>public SKPoint FontStartPoint { get; set; } = new SKPoint(0, 0);/// <summary>/// 是否沿路径绘制文本/// </summary>public bool IsAlongPath { get; set; } = false;/// <summary>/// 路径形状/// </summary>public FigureType PathType { get; set; } = FigureType.Circle;/// <summary>/// 文本距离形状起始点的偏移量/// </summary>public SKPoint Offset { get; set; } = new SKPoint(0, 0);
}

  创建“新建文本”窗口,根据文本绘制需要设置相应的属性框,如下图所示:
在这里插入图片描述
  感觉设置字体方面没有GDI+方便,同时SKPaint的Style属性应设置为Fill或者StrokeAndFill,设置为Stroke的话绘制的是文本边框,加粗效果不明显。绘制文本的主要代码如下所示。

skPaint.Color = element.FontColor;
skPaint.Typeface= SKTypeface.FromFamilyName(element.FontName,element.IsBoldFont?SKTypefaceStyle.Bold: SKTypefaceStyle.Normal);
skPaint.TextSize= element.FontSize;
skPaint.IsAntialias = true;
skPaint.StrokeWidth = 1;
skPaint.Style = SKPaintStyle.Fill;if (element.IsAlongPath)
{textPath= new SKPath();switch(element.PathType){case FigureType.Rect:textPath.AddRect(new SKRect(unitSize * element.StartPoint.X,unitSize * element.StartPoint.Y,unitSize * (element.StartPoint.X+element.EndPoint.X),unitSize *(element.StartPoint.Y+element.EndPoint.Y)));break;case FigureType.Circle:textPath.AddCircle(unitSize * element.StartPoint.X,unitSize * element.StartPoint.Y,unitSize * element.EndPoint.X);break;case FigureType.Oval:textPath.AddOval(new SKRect(unitSize * element.StartPoint.X,unitSize * element.StartPoint.Y,unitSize * (element.StartPoint.X + element.EndPoint.X),unitSize * (element.StartPoint.Y + element.EndPoint.Y)));break;}canvas.DrawTextOnPath(element.Content, textPath, unitSize * element.Offset.X, unitSize * element.Offset.Y, skPaint);
}
else
{canvas.DrawText(element.Content, unitSize * element.FontStartPoint.X, unitSize * element.FontStartPoint.Y, skPaint);
}

  程序的运行效果如下图所示。直接绘制文本的效果还可以,但是沿路径绘制文本的效果一般,暂不清楚是设置的问题还是代码没有写对,后续还得继续完善沿路径绘制文本功能。
在这里插入图片描述
在这里插入图片描述

参考文献:
[1]https://learn.microsoft.com/zh-cn/dotnet/api/skiasharp?view=skiasharp-2.88
[2]https://www.cnblogs.com/bhnian/p/16343557.html
[3]https://www.jb51.net/html5/676291.html
[4]https://blog.csdn.net/L_Shaker/article/details/127313457


http://www.ppmy.cn/embedded/116377.html

相关文章

JavaWeb JavaScript 11.XML —— 配置文件

生活想埋没我&#xff0c;没想到我是颗种子 —— 24.9.19 一、XML 1.什么是XML XML是EXtensible Markup Languge的缩写&#xff0c;翻译过来就是可扩展标记语言。所以很明显&#xff0c;XML和HTML一样都是标记语言&#xff0c;也就是说它们的基本语法都是标签 可扩展 三个字…

Leetcode42. 接雨水

讲的好的视频讲解 【很难想象这up刷题的精神状态 Leetcode42. 接雨水】 https://www.bilibili.com/video/BV1MC411n7Af/?share_sourcecopy_web&vd_sourceafbacdc02063c57e7a2ef256a4db9d2a rm是right max的意思&#xff0c;lm是left max的意思 时间复杂度&#xff1a; O (…

AI大模型项目实战v0.2: 结合个人知识库

前言 在AI大模型项目实战v0.1版本中&#xff0c;我们实现了一个最简单的基于纯LLM的问答机器人Tbot。 今天升级到v0.2版本&#xff0c;结合个人知识库。 本系列每个版本&#xff0c;都将提供完整的代码文档&#xff0c;获取方法见文末。 下面开启我们的v0.2版本之旅。 v0.2 Tb…

软件测试面试题(6)——二面(游戏测试)

没想到测试题做完等了会儿就安排面试了&#xff0c;还以为自己会直接挂在测试题&#xff0c;这次面试很刺激。测试题总体来说不算太难&#xff0c;主要是实操写Bug那里真没经历过&#xff0c;所以写的很混乱。 我复盘一下这次面试的问题&#xff0c;这次面试是有两个面试官&…

【已解决】华为AR100-S路由器 恢复出厂后,找不到5G wifi的设置

前两帖讨论了华为AR100-S路由器&#xff1a; 一是用电脑浏览器访问web管理界面报错的解决&#xff0c;详情点这里&#xff01; https://blog.csdn.net/weixin_62598385/article/details/142215136 再就是如何回复出厂&#xff0c;也即如何复位&#xff0c; 详情点这里&#xff…

9.24 C++ 常成员,运算符重载

//my_string.cpp #include "my_string.h" #include <iostream> #include <cstring>using namespace std;My_string::My_string():size(15){this->ptr new char[size];this->ptr[0] \0; //表示串为空串this->len 0;}//有参构造My_…

基于Vue3组件封装的技巧分享

本文在Vue3的基础上针对一些常见UI组件库组件进行二次封装&#xff0c;旨在追求更好的个性化&#xff0c;更灵活的拓展&#xff0c;提供一些个人的思路见解&#xff0c;如有不妥之处&#xff0c;敬请指出。核心知识点$attrs,$slots 需求 需求背景 日常开发中&#xff0c;我们经…

【鸿蒙HarmonyOS NEXT】用户首选项Preference存储数据

【鸿蒙HarmonyOS NEXT】数据存储之用户首选项Preference 一、环境说明二、Preference运作机制三、示例代码加以说明四、小结 一、环境说明 DevEco Studio 版本&#xff1a; API版本&#xff1a;以12为主 二、Preference运作机制 应用场景&#xff1a; 用户首选项为应用提…