首页 > 解决方案 > System.Drawing.Common DrawString 无法在 Linux 中正确呈现文本

问题描述

所以我不确定问题是什么,并且已经用尽了我能想到的所有选择。我的目标是 Ubuntu 18.04 LTS 上的 dotnet core 3.0。在 Windows 环境中,它工作正常,但在这个 Ubuntu 环境中,文本并没有呈现它所支持的方式,并且看起来像这样

它应该如何显示

它应该如何显示

它在 Ubuntu 上的显示方式

它在 Ubuntu 上的显示方式

我正在使用 Arial 字体,并且安装了 MS TrueType 字体包,我已经尝试过 Ubuntu 原生的字体系列,但还是一样。

标签: c#.netlinuxubuntusystem.drawing.common

解决方案


我在 Fedora 34 上遇到了同样的问题。

我使用这个示例文件重现了这个问题:

using System.Drawing;

Bitmap bmp = new Bitmap(200, 100);
using var gfx = Graphics.FromImage(bmp);
gfx.Clear(Color.Navy);
Font fnt = new Font("Arial", 18);
gfx.DrawString("test123", fnt, Brushes.Yellow, 10, 10);
bmp.Save("test.bmp");

(请注意,上面的代码使用 .NET 5 和 C# 9.0 编译和运行,因为它支持顶级语句,https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/top-水平陈述。)

但是,结果如下所示:

在此处输入图像描述

我为解决这个问题所做的是运行以下终端命令:

$ dotnet add package system.drawing.common

之后,重新构建并运行程序会生成此图像:

在此处输入图像描述

通过此更改,我的.csproj文件现在如下所示:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="system.drawing.common" Version="5.0.2" />
  </ItemGroup>

</Project>

仅供参考;我偶然发现这个问题的原因是当我尝试使用 ScottPlot 时,我提交了这个错误:https ://github.com/ScottPlot/ScottPlot/issues/1079


推荐阅读