提问者:小点点

在csharp中使用图形生成图形。根据平台的不同,DrawString渲染不同。(GDI)


对于一个在ASP. Net Core中构建的比利时体育社区项目,我正在用C#动态渲染一个图像。图像基于“基本图片”,在其中我动态添加文本,然后将图像返回给客户端。

它工作得很好,我对结果很满意。

但是,当我比较在我的开发环境(MacOS)上生成的客户端映像时,与我的正式生产环境(Azure平台中的LinuxVM)相比,该映像呈现得更漂亮。

作为比较,你可以看到两张图片,当你看文本时,你会看到它们的区别。在第二张图片中,文本字符串看起来更加像素化。

我能做些什么来避免这种情况吗?这可能与GPU的(不)可用性有关吗?

欢迎任何见解。

(我还添加了Nuget包runtime.osx.10.10-x64。CoreCompat.系统。绘图到我的项目,这是需要在我的MacOS上成功运行)

供参考:相关代码段:

public async Task<byte[]> CreateImageAsync(YearReview summary)
{
    var fonts = new PrivateFontCollection();
    fonts.AddFontFile(Path.Combine(_hostingEnvironment.WebRootPath, "fonts/bold.ttf"));
    fonts.AddFontFile(Path.Combine(_hostingEnvironment.WebRootPath, "fonts/light.otf"));
    var boldFont = fonts.Families[0];
    var lightFont = fonts.Families[1];

    var assembly = Assembly.GetAssembly(typeof(YearImageGenerator));
    var resourceName = "CotacolApp.StaticData.year-a.png";
    // Leaving out some variable/constants, irrelevant to the sample
    await using (var stream = assembly.GetManifestResourceStream(resourceName))
    {
        var bitmap = new Bitmap(stream);
        using (var gfx = Graphics.FromImage(bitmap))
        {
                using (Font f = new Font(boldFont, 58, FontStyle.Bold, GraphicsUnit.Pixel))
                {
                    gfx.DrawString($"{summary?.UniqueColsInYear.Number()}", f, Brushes.Black,
                        new RectangleF(0, startHeightYear, yearValuesRightBorder, 100f), rightAlignFormat);
                }
        }

        using (var imgStream = new MemoryStream())
        {
            bitmap.Save(imgStream, System.Drawing.Imaging.ImageFormat.Png);
            return imgStream.ToArray();
        }
    }
}

如果比较图片,请查看图片左侧的黑色数字和右侧的黑色文本。


共1个答案

匿名用户

不要使用System.绘图.微软自己在留档中对此提出警告。它存在于。NET Core仅用于兼容性

在里面NET6及更高版本的系统。绘画只有Windows操作系统才支持包含此类型的通用软件包。在跨平台应用程序中使用此类型会导致编译时警告和运行时异常。有关更多信息,请参阅系统。绘画仅在Windows上支持公用。

这篇链接文章解释了问题所在,并提供了几个跨平台的替代方案,如ImageSharp和SkiaSharp。

系统。绘图的主要工作是在屏幕上绘制UI,而不是操纵图像。在Windows上,它只是GDI上的一个非常薄的包装。与之相当的跨平台技术是毛伊岛,目前尚未发布。