2012-01-27 58 views
7

因为我试图用平滑和渲染的每个组合来绘制字符串与Graphics.DrawString()我想文本渲染器会更好地绘制我的字符串,但我认为是错误的。ASP.NET TextRenderer.DrawText可怕的文本图像

这是它是如何应该看起来像:

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

我需要一些建议,因为这真的很糟糕,随着更大的字体变得更糟,图像也没有收缩。

UPDATE:得到它与更大的字体(即20像素)工作,但用较小的字体也被那种会清除一些字母:

这是它是如何suposed要与字体宋体10px的:

enter image description here

这导致与Graphics.DrawString()

enter image description here

正如你所看到的,它确实不是很好,但最接近我。我做了一些修改代码,并得到了较大的字体效果会更好:

这是它是如何suposed要与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

完全一样的,感谢的建议和答复。

+0

什么图形格式你流图像? – 2012-01-27 18:47:43

+0

格式是Png,因为背景是透明的。我现在正在尝试使用TextRenderer时没有任何变化,但是我回到了Graphics.DrawString agian,结果更好一些。当我得到正确的组合后,我会发贴。 – formatc 2012-01-27 18:52:34

+0

酷,只是检查,以确保你没有尝试使用GIF,因为这会失去alpha通道,并给你类似的丑陋结果。 – 2012-01-27 19:04:41

回答

2

我建立的东西用类似的功能,生成图像按钮和我有问题与kerneling和字体不能伸展到所需的位置。以下设置让我真的接近我想要的,但仍然不是100%。

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

这是行得通的,但只适用于较大的字体(即20像素),无论如何最接近目前为止。我会尝试多玩一些,看看能否用较小的字体获得更好的效果。 – formatc 2012-01-27 18:59:51

0

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

+0

我试过了,它与较大的字体混杂在一起,与HighQuality相同。 – formatc 2012-01-28 12:36:34

2

Graphics.TextRenderingHint设置为SingleBitPerPixelGridFit

3

我不知道这将有助于但为什么没有函数调用不是创建您的字体,像这样:

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

这有助于使它更容易,但仍然一样,谢谢无论如何,我忽视了这一点。 – formatc 2012-01-27 18:57:11

+0

n.p.我认为它不会对渲染质量有所帮助,但简单的代码始终是:D – Hogan 2012-01-27 19:18:34