DotNetCore: Как использовать CoreCompact.System.Drawing.V2 для рисования китайских символов с использованием шрифта Noto Sens CJK в AWS Lambda env - PullRequest
0 голосов
/ 06 декабря 2018

Я пытался использовать пакет слепков CoreCompact.System.Drawing.V2 для рисования текста на растровых изображениях.

Поскольку я запускаю эту программу на AWS-лямбде, которая, как я полагаю, существуетв лямбда-среде DotNet Core отсутствует поддержка шрифтов Восточной Азии.

Поэтому я надеялся использовать библиотеку шрифтов Google Noto Sens CJK , чтобы добиться цели.

Но похоже,Независимо от того, как я изменил приведенный ниже пример кода, я не мог получить символы не ASCII, нарисованные на растровом изображении.т.е. "中文" (китайский)

  • Я тестировал образ Linux Docker и компьютер Mac OSX, оба запускались, но не могли правильно нарисовать вышеуказанные китайские символы.
  • Iустановили специфичные для платформы пакеты времени выполнения.т.е. runtime.linux-x64.CoreCompat.System.Drawing или runtime.osx.10.10-x64.CoreCompat.System.Drawing
  • Пример кода работает нормально намашина Windows - я правильно нарисовал символы.
  • Я также пытался использовать System.Drawing.Common, но для этого требуется, чтобы на хост-машине была установлена ​​библиотека libgdp и т. д., что не подходит для моего варианта использованияздесь.

Я всегда рисовал квадраты на картинке. Как это □□

Может ли кто-нибудь указать, где я ошибся в приведенном ниже примере кода?Пожалуйста, не обращайте внимания на настройку кодировки GDI - она ​​немного запутанная, я пытался проверить разные возможные комбинации.

class Program
{
    static readonly ManualResetEvent _quitEvent = new ManualResetEvent(false);

    static void Main(string[] args)
    {
        var fontCollection = new InstalledFontCollection();
        var privateCollection = new PrivateFontCollection();

        var fontFilePath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
        $"Fonts{Path.DirectorySeparatorChar}NotoSansCJK-Bold.ttc");

        Console.WriteLine($"{nameof(fontFilePath)} = [{fontFilePath}]");

        privateCollection.AddFontFile(fontFilePath);

        Console.WriteLine($"Fonts available: [{string.Join(",", privateCollection.Families.Select(x => x.Name))}]");

        Task.Run(()=>
        {
            while (true)
            {
                Console.WriteLine("Input the string you want to draw:");
                var input = Console.ReadLine();

                Console.WriteLine("Using which charset? Press enter to use the default one (1)");

                var charSet = Console.ReadLine();
                var targetFont = new Font(privateCollection.Families.First(x => x.Name == "Noto Sans CJK SC"),
                 12, FontStyle.Bold, GraphicsUnit.Pixel, string.IsNullOrEmpty(charSet)? (byte)1: byte.Parse(charSet));

                var canvas = new Bitmap(100, 40);

                var graphis = Graphics.FromImage(canvas);
                graphis.Clear(Color.White);
                try
                {
                    graphis.DrawString(input, font: targetFont, brush: Brushes.Black, x: 0, y: 0);
                }
                catch(Exception ex)
                {
                    Console.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace);
                }
                using (var ms = new MemoryStream())
                {
                    var encoderParameters = new EncoderParameters(1) { Param = { [0] = new EncoderParameter(encoder: Encoder.Quality, value: 70) } };

                    var codec = ImageCodecInfo.GetImageDecoders().FirstOrDefault(c => c.FormatID == ImageFormat.Bmp.Guid);

                    canvas.Save(ms, codec, encoderParameters);

                    File.WriteAllBytes("test.bmp", ms.ToArray());

                }
            }

        });

        Console.CancelKeyPress += (sender, e) => { _quitEvent.Set(); };

        _quitEvent.WaitOne();
    }

}

Любые предложения приветствуются!

Заранее большое спасибо!

JJ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...