我遇到了一个奇怪的问题,SkiaSharp(2.80.0(主要在我的Synology环境中工作。它可以绘制形状、调整大小和写入图像。它只是从不显示文本。
当在Windows中运行时,相同的代码可以很好地呈现文本。
这里有一个代码示例来演示。
//In Windows, this produces blue TEST text on top of the resized source image as expected.
//In the Synology environment, the text is missing, but the image is still successfully resized.
float scale = (float)(RESIZE_WIDTH / originalImage.Width);
using (SKBitmap resizedImage = originalImage.Resize(new SKImageInfo((int)Math.Round(originalImage.Width * scale), (int)Math.Round(originalImage.Height * scale)), SKFilterQuality.High))
{
using (SKCanvas canvas = new SKCanvas(resizedImage))
{
var paint = new SKPaint
{
Color = SKColors.Blue,
IsAntialias = true,
Style = SKPaintStyle.Fill,
TextAlign = SKTextAlign.Center,
TextSize = 90,
Typeface = SKTypeface.CreateDefault()
};
var coord = new SKPoint(resizedImage.Width / 2, (resizedImage.Height + paint.TextSize) / 2);
canvas.DrawText("TEST", coord, paint);
canvas.Flush();
using (var image = SKImage.FromBitmap(resizedImage))
{
using (var data = image.Encode())
{
using (var stream = new FileStream(outputFile, FileMode.Create, FileAccess.Write))
data.SaveTo(stream);
}
}
}
}
我是否需要在SkiaSharp中以编程方式配置某些内容,以使DrawText在Windows中的Synology环境中工作?
编辑1:我现在已经在Ubuntu安装上测试过了,DrawText和其他一切都很好。
编辑2:将显式字体添加到示例代码
对我有效的解决方案是在应用程序中嵌入字体,如果系统无法提供,则使用SKTypeface.FromStream加载字体。
感谢SkiaSharp社区在GitHub上提供的建议:https://github.com/mono/SkiaSharp/issues/1564#issuecomment-748581747
要将字体文件添加到项目中,并确保它与其他项目文件一起发布,可以执行以下步骤:
-
创建一个";字体"文件夹:在项目的解决方案资源管理器中,右键单击项目名称,选择";添加">quot;"新建文件夹";并将其命名为";字体">
-
将字体文件添加到";字体"文件夹:右键单击";字体"文件夹,选择";添加">quot;现有项目;然后浏览到字体文件的位置(例如Arial.ttf(。选择字体文件并单击";添加">
-
设置字体文件的";复制到输出目录";属性:在"字体"文件夹,右键单击它,然后选择";属性"在属性窗口中,找到";复制到输出目录";属性,并将其设置为";如果更新则复制";或";始终复制"这样可以确保在构建或发布项目时,字体文件将被复制到输出目录(例如,bin/Debug或bin/Release(。
-
访问代码中的字体文件:现在,您可以从代码中访问字体文件,并使用
SKTypeface.FromStream
方法加载它。下面是一个如何从";字体"文件夹:var fontPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Fonts", "Arial.ttf"); using (var fontStream = File.OpenRead(fontPath)) { var typeface = SKTypeface.FromStream(fontStream); textPaint.Typeface = typeface; }
在本例中;Arial ttf";从";字体"文件夹。根据您添加到"宋体"的实际字体文件名调整文件名("Arial.ttf"(;字体"文件夹
-
发布项目:发布项目时,字体文件将与其他项目文件一起包含在输出目录中。
通过这些步骤,字体文件将与项目一起打包和发布,确保在部署应用程序时它在目标服务器上可用。