SkiaSharp 未在大字体(X 坐标)应绘制的位置绘制文本

问题描述 投票:0回答:1

我正在使用 SkiaSharp 渲染用于打印的票据。我以常规字体大小打印多行,并使用大字体打印票号。这是我正在使用的 SKPaint 对象:

using SKPaint regular = new()
{
    Color = SKColors.Black,
    IsAntialias = true,
    TextSize = regularFontSize, // 30
    Typeface = SKTypeface.FromFamilyName(
        familyName: "Roboto")
};

using SKPaint large = new()
{
    Color = SKColors.Black,
    IsAntialias = true,
    TextSize = largeFontSize, // 250
    Typeface = SKTypeface.FromFamilyName(
        familyName: "Roboto")
};

我这样画文字:

canvas.DrawText(Model.TicketNumber, X, Y, large);
canvas.DrawText(Model.LocationInfo, X, Y, regular);

我按照以下方式将文本在图像中水平居中: 我测量文本大小(根据本指南https://swharden.com/csdv/skiasharp/text/

large.MeasureText(Model.TicketNumber, ref rectangle);

然后我这样计算X坐标:

X = canvasSize/2 - rectangle.size/2

我得到的输出如下所示:

enter image description here

我已在“画图”中添加了线条。橙色垂直线是中心线。您可以立即看到大文本“888”明显偏离中心。测量实际像素表明,虽然其他线要么处于死点,要么仅偏离 5 个或更少像素,但大数字确实相当偏离。

我尝试用字母代替数字,结果文本仍然偏离中心。所有线路的计算逻辑都是相同的。唯一的变量是字体大小。在你问之前,我确定字符串中没有任何前导空格。

我已经调试了代码并查看了测量的文本尺寸。宽度与打印文本的宽度相同。我还检查了计算出的X值。它是 102.6 像素(加上变化)。顺便说一句,如果文本从该 X 坐标开始,它就会位于死点。

就像放置文本时文本渲染器有点偏离,并且这种差异随着字体大小的增加而增加。知道如何解决这个问题吗?有趣的是,Y 坐标总是准确的。

或者,还有另一种方法可以使文本在画布上水平居中吗?有没有这个问题的?

谢谢你。

.net drawing centering
1个回答
0
投票

我解决了。

SKPaint
有一个名为
TextAlign
的属性,默认设置为
Left
。如果将其设置为
Center
,X 坐标将代表文本的中心而不是左边缘。然后你需要做的就是设置
X = canvasWidth/2
,一切都会处于中心位置。

© www.soinside.com 2019 - 2024. All rights reserved.