System.Drawing - 在透明像素上使用DrawString进行错误的文本渲染

mac*_*nir 30 c# system.drawing gdi+ drawstring winforms

将文本渲染到位图时,我发现当在具有非不透明alpha的区域上渲染时,文本看起来非常糟糕.随着基础像素变得更加透明,问题逐渐恶化.如果我不得不猜测我会说当底层像素是透明的时,文本渲染器将任何消除锯齿的"灰色"像素绘制为纯黑色.

以下是一些截图:

在透明像素上绘制的文字:

替代文字

在半透明像素上绘制的文字:

替代文字

在不透明像素上绘制的文字:

替代文字

以下是用于呈现文本的代码:

g.SmoothingMode = SmoothingMode.HighQuality;
g.DrawString("Press the spacebar", Font, Brushes.Black, textLeft, textTop);
Run Code Online (Sandbox Code Playgroud)

小智 28

我用来解决这个问题的选项是:

Graphics graphics = new Graphics();
graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit;
Run Code Online (Sandbox Code Playgroud)

TextRenderingHint中还有一些其他有用的选项

希望能帮助到你

  • user3470185的答案(g.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAliasGridFit)产生更好的结果. (4认同)

小智 16

对此有一个非常简单的答案......

g.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAliasGridFit
Run Code Online (Sandbox Code Playgroud)

如果在渲染文本之前设置它,它将会清晰显示.此外,此方法支持更多字体大小(默认值最大为56).

感谢您阅读这篇文章.


Han*_*ant 12

第一个输出是在黑色背景上绘制黑色文本时得到的结果,可能是Color.Transparent.第二个是在几乎黑色的背景上绘制的.第三个是在与它一起显示的相同背景上绘制的.

在透明背景上,抗锯齿功能无法使用.当文本以不同的背景显示时,用于抗锯齿像素的颜色不会将字母形状混合到背景中.这些像素现在变得非常明显,并使文本看起来非常糟糕.

请注意,SmoothingMode不会影响文本输出.如果您使用较低质量的TextRenderingHint并且背景颜色为灰色且alpha为零,那么它看起来会稍微不那么糟糕.只有TextRenderingHint.SingleBitPerPixelGridFit可以避免所有的抗锯齿问题.

获得完美的解决方案非常困难.Vista在窗口标题栏上的玻璃效果使用非常微妙的阴影来为文本提供明确定义的背景颜色.您需要SysInternals的ZoomIt工具才能真正看到它.DrawThemeTextEx()函数具有非零iGlowSize.