我正在使用 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
我得到的输出如下所示:
我已在“画图”中添加了线条。橙色垂直线是中心线。您可以立即看到大文本“888”明显偏离中心。测量实际像素表明,虽然其他线要么处于死点,要么仅偏离 5 个或更少像素,但大数字确实相当偏离。
我尝试用字母代替数字,结果文本仍然偏离中心。所有线路的计算逻辑都是相同的。唯一的变量是字体大小。在你问之前,我确定字符串中没有任何前导空格。
我已经调试了代码并查看了测量的文本尺寸。宽度与打印文本的宽度相同。我还检查了计算出的X值。它是 102.6 像素(加上变化)。顺便说一句,如果文本从该 X 坐标开始,它就会位于死点。
就像放置文本时文本渲染器有点偏离,并且这种差异随着字体大小的增加而增加。知道如何解决这个问题吗?有趣的是,Y 坐标总是准确的。
或者,还有另一种方法可以使文本在画布上水平居中吗?有没有这个问题的?
谢谢你。
我解决了。
SKPaint
有一个名为 TextAlign
的属性,默认设置为 Left
。如果将其设置为 Center
,X 坐标将代表文本的中心而不是左边缘。然后你需要做的就是设置X = canvasWidth/2
,一切都会处于中心位置。