Я пытался использовать пакет слепков 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