为什么C#图形文本抗锯齿质量在字体较小的情况下那么差?

问题描述 投票:0回答:1

我正在尝试使用 Bebas 字体将文本渲染到 C# 中的位图。

考虑以下从文件系统加载 .png 以呈现覆盖文本的代码:

public Bitmap CreateCard(AccumulatedStats player, string template, bool includeGamerpic = false)
    {
        Bitmap imageCache = new Bitmap(template);
        using (Graphics g = Graphics.FromImage(imageCache))
        {
            //AddAvatar(g, player);
            AddGamertag(g, player);
            //AddStats(g, player);
            //AddLogo(g, player);
            AddPrimaryPosition(g, player);
        }
        return imageCache;
    }

AddGamertag
方法以38号字体绘制文本,并正确渲染:

AddPrimaryPosition
方法以12号字体绘制文本,质量不可接受:

        private void AddPrimaryPosition(Graphics g, AccumulatedStats player)
    {
        Brush bgText = new SolidBrush(Color.FromArgb(red: 238, green: 243, blue: 234));
        var centerAlign = new StringFormat() { Alignment = StringAlignment.Center };
        Font bebas = new Font("Bebas", 12);

        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
        g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
        g.DrawString($"Lorem Ipsum\nYour Name Here", bebas, bgText, new PointF(601, 221), centerAlign);
        //g.DrawString($"Lorem Ipsum\nYour Name Here", bebas, Brushes.Black, new PointF(843, 221), centerAlign);
    }

请注意,我使用

SmoothingMode
TextRenderingHint
来指定抗锯齿。

将其与 Paint.NET 的质量进行比较:

我发现一个问题指出“类似行为”,其中接受的答案表明该区域未初始化。为了解决这个问题,我尝试在绘制文本之前先绘制一个彩色矩形,希望抗锯齿能够从文本后面的矩形中采样: private void AddPrimaryPosition(Graphics g, AccumulatedStats player) { Brush bgText = new SolidBrush(Color.FromArgb(red: 238, green: 243, blue: 234)); var centerAlign = new StringFormat() { Alignment = StringAlignment.Center }; Font bebas = new Font("Bebas", 12); // Slight red offset for testing, should be 0 var islesBlue = new SolidBrush(Color.FromArgb(red: 200, green: 83, blue: 155)); g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; Rectangle rect = new Rectangle(499, 219, 203, 66); g.FillRectangle(islesBlue, rect); g.DrawRectangle(new Pen(islesBlue), rect); g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit; g.DrawString($"Lorem Ipsum\nYour Name Here", bebas, bgText, new PointF(601, 221), centerAlign); g.DrawString($"Lorem Ipsum\nYour Name Here", bebas, Brushes.Black, new PointF(843, 221), centerAlign); }

请注意,我还将文本进一步渲染到右侧,其中我的背景与背景颜色相匹配,其中

AddGamertag

绘制了较大的文本。

我更改了此方法来设置 

SmoothingMode=None

TextRenderingHint=SingleBitPerPixel
,这看起来不同(表明之前发生了一些抗锯齿),但也差得令人无法接受:

为什么较小字体时的抗锯齿质量如此差?有没有办法解决这个问题而不诉诸更大的文本或不同的字体?

c# .net graphics system.drawing antialiasing
1个回答
0
投票

我最初运行此程序的 PC 是一台基于 Intel 的旧 Macbook,通过 Bootcamp 运行 Windows 10,配有 Intel Core i2xxx 系列 CPU 和 Intel HD Graphics 4000。

我重新运行此程序的 PC 是 Windows 10 台式机,配有 Intel Core i2500k CPU 和 nvidia Geforce GTX970 GPU。

我的猜测是,这是 Windows GDI+ 问题、驱动程序问题或 Macbook 的硬件功能集问题,因为所有其他变量(源代码、作为位图加载的源图像等)都保持不变。

© www.soinside.com 2019 - 2024. All rights reserved.