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

  印章中的文本主要分为两种: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值