有没有更好的方法来反对.NET 2.0上的别名文本?

时间:2011-11-24 16:13:58

标签: c# .net winforms fonts

我想在此屏幕截图中使用反别名:

enter image description here

我已经尝试了所有的TextRenderingHints,但它看起来仍然很糟糕。 请注意,当我执行屏幕截图时,PNG会使其更顺畅,但您仍然可以看到第二个文本不如第一个文本好。 这是我的代码:

private void Form1_Paint(object sender, PaintEventArgs e) {
    try {
        SolidBrush solidBrush = new SolidBrush(Color.Black);
        PrivateFontCollection fonts;
        FontFamily family = LoadFontFamily(Properties.Resources.SegoeWP_Light, out fonts);
        Font font = new Font(family, 18);
        e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
        e.Graphics.TextRenderingHint = TextRenderingHint.SystemDefault;
        e.Graphics.DrawString("Downloads", font, solidBrush, new PointF(135, 80));
    } catch (Exception ex) {
        MessageBox.Show(ex.ToString());
    }
}

在WinForms(.NET 2.0)上有平滑字体的不同方法吗?

2 个答案:

答案 0 :(得分:4)

我相信Photoshop会过度采样。你可能无法获得比Photoshop更好的结果 - 它有更好的像素捕捉算法,它可能会做一些事情,比如稍微增加轮廓以获得更暗的结果 - 但是如果SmoothingMode.AntiAlias(如乔治)建议)是不够的,您可以尝试这些步骤,看看他们是否得到了您想要的结果。

  1. 创建一个新的Font,其大小是您最终想要的两倍。
  2. 使用较大的字体测量文本,并创建该大小的Bitmap。确保使用支持Alpha透明度的格式创建它。
  3. 将文本绘制到Bitmap(at(0,0))。 (你可能想在这里使用SmoothingMode.AntiAlias。)
  4. Bitmap绘制到最终目标,将其缩小50%。确保使用高质量的调整大小模式。
  5. 这将为您的样本图像提供更多“平滑”效果,因为您基本上是绘制到子像素网格。但是,您的结果可能会有所不同 - 您可能需要绘制(0,1)而不是(0,0)以使其看起来足够清晰,并且您可能需要调整字体大小。你甚至可以尝试以3倍而不是2倍的速度进行绘制,但是你不会从远远超过那里获得很多好处。

    最大的担忧是你的文字可能不够暗 - 如果线条在2倍大小的情况下以1像素宽度绘制,那么它们在最终结果中只会是50%黑色。处理此问题的最佳方法是选择较粗的字体。您也可以尝试透过Bitmap中的文本 - 在(0,0)处绘制一次,然后再在(0,1)或(1,0)处绘制 - 以查看是否会使线条变粗一旦你缩小尺寸就看起来很好看。你必须进行实验。

    我不建议将它用于通用文本绘图(用户选择布局和字体大小),但如果您可以完全控制字体大小,您可以调整它以获得相当好的效果结果

答案 1 :(得分:3)

我原以为以下就够了。

e.Graphics.TextRenderingHint = TextRenderingHint.AntiAlias;

如果没有,可以尝试下面页面上的示例而不做任何更改,然后逐渐添加您的更改,直到它发生故障。

How to: Use Antialiasing with Text