System.Drawing.Common在Linux中无法正常工作

时间:2019-09-19 19:59:02

标签: c# linux .net-core drawing right-to-left

请考虑以下代码:

public static Stream WatermarkIt(Stream originalFile, Stream watermarkFile, string text1, string text2)
{
    var original = Image.FromStream(originalFile);
    var watermark = Image.FromStream(watermarkFile);
    using (var graphics = Graphics.FromImage(original))
    {
        graphics.DrawImage(watermark, new Point());
        var format = new StringFormat(StringFormatFlags.NoWrap | StringFormatFlags.NoFontFallback);
        graphics.DrawString(text1, new Font("FreeSans", 50), new SolidBrush(Color.FromArgb(100, 127, 127, 127)), new Rectangle(0, 200, original.Width, original.Height));
        format = new StringFormat(StringFormatFlags.NoWrap | StringFormatFlags.DirectionRightToLeft | StringFormatFlags.NoFontFallback, new CultureInfo("fa-IR").LCID);
        graphics.DrawString(text2, new Font("FreeSans", 50), new SolidBrush(Color.FromArgb(100, 127, 127, 127)), new Rectangle(0, 400, original.Width, original.Height), format);
    }
    var memoryStream = new MemoryStream();
    original.Save(memoryStream, ImageFormat.Jpeg);
    memoryStream.Seek(0, SeekOrigin.Begin);
    return memoryStream;
}

现在应该在Windows(.net核心2.2)下创建正确完成的输出

The watermark output from windows

但是在Linux下,输出为:

The watermark output from Linux

如果我将第二种字体更改为:

graphics.DrawString(text2, new Font("Noto Arabic", 50) ...

我们得到了:

Improved watermark output from Linux

现在有一些发现:

  1. 第一个水印是从.png文件中读取的,颜色为灰色,不透明度为77,但是在linux下,文本被解释为白色,但具有一定的透明度。
  2. 从右至左的文字未正确绘制。

这是因为System.Drawing.Common是在Linux中部分实现的,还是可以解决此问题?

1 个答案:

答案 0 :(得分:1)

System.Drawing.Common 依赖 libgdiplus 库来渲染文本,而且这个库有两个引擎(cairo 和 pango),不幸的是默认的一个(cairo)不支持阿拉伯语。

所以选择不是从apt-get或任何包管理器下载libgdiplus,因为它已经用cairo引擎构建了,你必须下载源代码并自己构建它。

首先下载所需的依赖项:

sudo apt-get install libgif-dev autoconf libtool automake build-essential gettext libglib2.0-dev libcairo2-dev libtiff-dev libexif-dev

下载 pango 引擎:

sudo apt-get install libpango1.0-dev

然后下载libgdiplus的源代码:

sudo apt-get install git
git clone https://github.com/mono/libgdiplus.git

然后构建并安装库(首先进入 insisde libgdiplus,即 cd libgdiplus):

./autogen.sh --with-pango --prefix=/usr
make
sudo make install

现在你可以运行你的代码,你会看到阿拉伯语被正确呈现。