System.Drawing.Common не работает правильно в Linux - PullRequest
1 голос
/ 19 сентября 2019

Пожалуйста, рассмотрите этот код:

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 core 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, или возможно обойти эту проблему?

...