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

news2025/1/9 16:36:27

  印章中的文本主要分为两种: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.coloradmin.cn/o/2143320.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python编码系列—Python代理模式:为对象赋予超能力的魔法

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

【自学笔记】支持向量机(2)——核函数

引入 核函数的功能是将一组数据映射到更高维的特征空间&#xff0c;这样可以让在低维无法线性分类的数据能够在高维空间下被分类。   可以证明&#xff0c;如果原始数据是有限的维度&#xff0c;那么一定存在一个高维特征空间使得样本线性可分。 文章内容由《机器学习》相关内…

地平线秋招2025

【地平线秋招】 中秋卷起来&#xff01;&#xff01;&#xff01; 内推码 kbrfck 内推码 kbrfck 内推码 kbrfck 投递链接&#xff1a;https://wecruit.hotjob.cn/SU62d915040dcad43c775ec12c/mc/position/campus?acotycoCodekbrfck&recruitType1&isLimitShowPostScope…

Ubantu和Centos7一键shell更换镜像源与Linux系统Python3环境安装

目录 前言 1.一键更换源 1.1 创建文件 1.2 向环境赋予可执行的权限 2.Linux系统配置Python3环境 2.1 查看当前python环境 2.2 更换源 2.3 安装所需的依赖 2.4.下载python环境文件 2.5.解压文件 2.6 进行编译 2.7 开始安装 2.8 设置软连接 2.9 测试是否安装成功…

苍穹外卖Day01-2

导入接口文档 yApi接口管理平台http://api.doc.jiyou-tech.com/ 创建项目 导入接口文件 导入结果界面 Swagger 介绍 使用Swagger你只需要按照它的规范去定义接口及接口相关的信息&#xff0c;就可以做到生成接口文档&#xff0c;以及在线接口调试页面。 官网&#xff1a;ht…

计算机人工智能前沿进展-大语言模型方向-2024-09-16

计算机人工智能前沿进展-大语言模型方向-2024-09-16 1. Securing Large Language Models: Addressing Bias, Misinformation, and Prompt Attacks B Peng, K Chen, M Li, P Feng, Z Bi, J Liu, Q Niu - arXiv preprint arXiv:2409.08087, 2024 保护大型语言模型&#xff1a;…

走进低代码表单开发(三):高效业务功能构建

前面我们已经介绍了勤研低代码开发平台的页面设计相关的内容&#xff0c;当页面设计完成后&#xff0c;我们将继续进行表单的功能开发&#xff0c;接下来&#xff0c;我们一起走进勤研低代码开发平台高效便捷的表单功能设计&#xff0c;来看看勤研低代码平台如何为用户带来全新…

MFC实现对话框与控件的自适应调节

一.对话框属性设置 先将对话框的Border属性由Dialog Frame设置为Resizing。 二.添加消息处理函数 类向导 -> 消息&#xff08;WM-SIZE&#xff09;添加处理函数->void COnshowDlg::OnSize(UINT nType, int cx, int cy)。 三.添加代码 在.h文件中声明&#xff1a; vo…

每日一题——第九十九题

// PrintUniqueChart.cpp : 此文件包含 “main” 函数。程序执行将在此处开始并结束。 // // 设计算法&#xff0c;打印如下图案&#xff1a; #include<stdio.h>int main() {int i, j;for (i 0; i < 5; i){//每行开始先打印空格//控制每行前的空格for (int space 0…

gitee远程仓库OPEN GIT BASH HERE从错误中学习

推荐一个ai软件&#xff08;搜索器搜索kimi&#xff09;&#xff0c;是一个ai&#xff0c;有什么错误跟着一步步解决就可以了 当你创建一个仓库 会出现这些 打开这个窗口跟着敲就行了 到这里为止我还没出现错误&#xff0c;后面我把remote add添加远程仓库的地址输错地址了 所…

网络安全-ssrf

目录 一、环境 二、漏洞讲解 三、靶场讲解 四、可利用协议 4.1 dict协议 4.2 file协议 4.3 gopher协议 五、看一道ctf题吧&#xff08;长亭的比赛&#xff09; 5.1环境 5.2开始测试 ​编辑 一、环境 pikachu&#xff0c;这里我直接docker拉取的&#xff0c;我只写原…

【H2O2|全栈】关于CSS(5)如何制作一个搜索网页的首页?

目录 CSS基础知识 前言 准备工作 简单网页的组成部分 案例 浏览器的窗口大小 划分主要部分 固定定位 头部导航&#xff08;左侧&#xff09; 头部导航&#xff08;右侧&#xff09; LOGO ​编辑搜索框 热搜标题 热搜内容 文字简介 资源 预告和回顾 后话 CSS…

孙怡带你深度学习(2)--PyTorch框架认识

文章目录 PyTorch框架认识1. Tensor张量定义与特性创建方式 2. 下载数据集下载测试展现下载内容 3. 创建DataLoader&#xff08;数据加载器&#xff09;4. 选择处理器5. 神经网络模型构建模型 6. 训练数据训练集数据测试集数据 7. 提高模型学习率 总结 PyTorch框架认识 PyTorc…

Visual Studio 2019/2022 IntelliCode(AI辅助IntelliSense)功能介绍

IntelliCode 不知在多久以前&#xff0c;我装上了Visual Studio 2019&#xff0c;写代码时&#xff0c;就注意到了下面这样的东西&#xff1a;带五角星的提示。 这个带五角星的提示功能叫做IntelliCode。 我们知道Visual Studio 有个强大的功能叫做Intellisense(智能感知)&am…

【Linux系统编程】信号的保存与处理

目录 一&#xff0c;信号的保存 1-1&#xff0c;core与Term终止信号 1-2&#xff0c;进程退出与信号的关系 1-3&#xff0c;信号在内核中的表示 1-4&#xff0c;信号操作函数 二&#xff0c;信号的处理 2-1&#xff0c;信号被处理的时期 2-2&#xff0c;内核实现信号的…

马匹行为识别系统源码分享

马匹行为识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

C++ Primer Plus(速记版)-高级主题

第十七章 用于大型程序的工具 C 解决问题规模多样&#xff0c;对复杂问题尤其需用异常处理、命名空间和多重继承增强代码管理、库整合和概念表达&#xff0c;以适应大规模编程对错误处理、模块组合及高级功能设计的高要求。 17.1. 异常处理 异常处理允许C程序中不同部分通过抛…

解决Tez报错问题

在启动hive的时候&#xff0c;发现该报错 1、检测HADOOP_PATH环境变量 echo $HADOOP_CLASSPATH 如果没有输出&#xff0c;说明我们的配置文件没有生效&#xff0c;这时候需要重写source一下 2、刷新配置文件生效 source /etc/profile 有输出&#xff0c;环境生效 3、再次运…

Matlab simulink建模与仿真 第十八章(Stateflow状态机)

参考视频&#xff1a;Simulink/stateflow的入门培训_哔哩哔哩_bilibili 一、概述 Stateflow是集成于Simulink中的图形化设计与开发工具&#xff0c;主要用于针对控制系统中的复杂控制逻辑进行建模与仿真&#xff0c;或者说&#xff0c;Stateflow适用于针对事件响应系统进行建模…

Java项目实战II基于Java+Spring Boot+MySQL的校园社团信息管理系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、论文参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在当今高校…