ASP.NET TextRenderer.DrawText可怕的文本图像

时间:2012-01-27 18:19:51

标签: c# asp.net

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

这应该是这样的:

enter image description here

这就是它的样子:

enter image description here

这是我的代码:

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;
}

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

更新:让它使用更大的字体(即20px),但使用较小的字体,它会在某些字母上被删除:

这就是字体Arial 10px:

的用法

enter image description here

这是Graphics.DrawString()

的结果

enter image description here

你可以看到它真的不是很好但是我最接近。我对代码进行了一些更改,并使用更大的字体获得了更好的结果:

这就是使用字体Arial 20px:

的方式

enter image description here

这是绘图结果:

enter image description here

这是更改的代码(我直接使用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;

以下是白色背景上的这些设置的最终图像:

enter image description here

完全相同,感谢您的建议和回复。

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

Graphics.TextRenderingHint设为SingleBitPerPixelGridFit

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

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