我正在尝试使用 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
来指定抗锯齿。
我发现一个问题指出“类似行为”,其中接受的答案表明该区域未初始化。为了解决这个问题,我尝试在绘制文本之前先绘制一个彩色矩形,希望抗锯齿能够从文本后面的矩形中采样:
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
,这看起来不同(表明之前发生了一些抗锯齿),但也差得令人无法接受:为什么较小字体时的抗锯齿质量如此差?有没有办法解决这个问题而不诉诸更大的文本或不同的字体?