【问题标题】:ASP.NET TextRenderer.DrawText Awful Text ImagesASP.NET TextRenderer.DrawText 糟糕的文本图像
【发布时间】:2012-01-27 18:19:51
【问题描述】:

由于我尝试使用Graphics.DrawString() 进行平滑和渲染的每种组合来绘制字符串,所以我认为文本渲染器会更好地绘制我的字符串,但我认为这是错误的。

它应该是这样的:

这就是它的样子:

这是我的代码:

Graphics objGraphics2 = Graphics.FromImage(objBitmap);

objGraphics2.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
objGraphics2.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
objGraphics2.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
objGraphics2.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear;

Font textFont = new Font(textFontFamily, PxtoEm(textSize));

SolidBrush b = new SolidBrush(textColor);

TextRenderer.DrawText(objGraphics2, textValue, textFont, new Rectangle(0, 0, Width, Height), textColor);

我的PxtoEm方法错了吗?

public float PxtoEm(int px)
{
      float em = (float)(Convert.ToDouble(Convert.ToDouble(px) * Convert.ToDouble(72) / Convert.ToDouble(objBitmap.HorizontalResolution)));
      return em;
}

我需要一些建议,因为这真的很糟糕,更大的字体会变得更糟,而且图像不会缩小。

更新:可以使用更大的字体(即 20 像素),但使用较小的字体会在某些字母上被删除:

这就是 Arial 10px 字体应该是这样的:

这是Graphics.DrawString()的结果

如您所见,它确实不是很好,但我得到的最接近。我对代码进行了一些更改,并使用更大的字体获得了更好的结果:

这就是 Arial 20px 字体应该是这样的:

这是绘制结果:

这是修改后的代码(我放弃了 em 方法并直接使用像素,切换到 Graphics.DrawString() 而不是 TextRenderer.DrawText()

  Graphics objGraphics = Graphics.FromImage(objBitmap);
  objGraphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
  objGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
  objGraphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
  objGraphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
  objGraphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
  Font textFont = new Font(textFontFamily, textSize,GraphicsUnit.Pixel);
  SolidBrush b = new SolidBrush(textColor);
  PointF origin = new PointF((float)TextLeft,(float)TextTop);
  StringFormat format = StringFormat.GenericTypographic;

  objGraphics.DrawString(textValue, textFont, b , origin, format);

如果有人有一些建议,可以为较小的文本大小编写不同的方法,并将上面的代码用于较大的代码,因为它工作得很好,发布它,我会试试的!

更新 3:终于找到了所有问题的解决方案,而且解决方案相当简单: 不要使用透明背景!

设置如下:

 objGraphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
 objGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; // <-- important!
 objGraphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
 objGraphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
 objGraphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
          objGraphics.TextContrast = 0;

这是在白色背景上具有这些设置的最终图像:

一模一样,谢谢建议和回复。

【问题讨论】:

  • 您将图像流式传输为什么图形格式?
  • 格式是 PNG 因为背景是透明的更好的。当我得到正确的组合时,我会发布 agian。
  • 酷,只是检查以确保您没有尝试使用 GIF,因为那样会丢失 alpha 通道并给您类似的丑陋结果。

标签: c# asp.net


【解决方案1】:

我不确定它是否会有所帮助,但为什么不在没有函数调用的情况下创建字体,如下所示:

 Font textFont = new Font(textFontFamily, textSize, GraphicsUnit.Pixel);

【讨论】:

  • 这有助于使它更容易,但仍然一样,谢谢我忽略了这一点。
  • n.p.我认为这对渲染质量没有帮助,但更简单的代码总是一个 :D
【解决方案2】:

我构建了一些东西来使用类似的功能生成图像按钮,但我遇到了内核问题和字体没有拉伸到所需的问题。以下设置让我非常接近我想要的,但仍然不是 100%。

objGraphics2.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
objGraphics2.TextRenderingHint = System.Drawing.Drawing2D.TextRenderingHint.AntiAliasGridFit;

【讨论】:

  • 这是有效的,但仅适用于较大的字体(即 20 像素),无论如何我到目前为止最接近。我会尝试多玩一些,看看是否可以使用更小的字体获得更好的效果。
【解决方案3】:

将Graphics.TextRenderingHint 设置为SingleBitPerPixelGridFit。

【讨论】:

    【解决方案4】:

    我不确定这是否能解决问题,但我在 Direct3D 中绘制文本时遇到了类似问题,请查看 PixelOffsetMode,将其设置为 Half。

    【讨论】:

    • 我试过了,大字体会很乱,小字体和高品质一样。
    猜你喜欢
    • 2014-06-20
    • 1970-01-01
    • 2012-01-15
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多