C# ASP.NET TextRenderer.DrawText文本图像

C# ASP.NET TextRenderer.DrawText文本图像,c#,asp.net,C#,Asp.net,由于我尝试过使用Graphics.DrawString()将平滑和渲染的各种组合绘制字符串,所以我认为文本渲染器可以更好地绘制字符串,但我认为这是错误的 应该是这样的: 这就是它的样子: 这是我的密码: Graphics objGraphics2 = Graphics.FromImage(objBitmap); objGraphics2.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; objGraphi

由于我尝试过使用
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;
}
我需要一些建议,因为这真的很糟糕,字体越大,图像越不缩小,情况就越糟

更新:使用较大字体(即20px)时,它会工作,但使用较小字体时,某些字母会被擦除:

这就是使用Arial 10px字体的方式:

这是使用
Graphics.DrawString()

正如你所看到的,这真的不是很好,但我得到的最接近。我对代码做了一些更改,并使用更大的字体获得了更好的结果:

这就是使用Arial 20px字体的方式:

这是绘图结果:

下面是更改后的代码(我删除了em方法,直接使用像素,切换到Graphics.DrawString()而不是textrender.DrawText())

如果有人建议为较小的文本大小编写不同的方法,并在较大的文本大小中使用上述代码,因为它工作得很好,请发布它,我会尝试

更新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;
objGraphics.SmoothingMode=System.Drawing.Drawing2D.SmoothingMode.HighQuality;

objGraphics.TextRenderingHint=System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;//我不确定这是否能解决问题,但我在Direct3D中绘制文本时遇到了类似的问题,请检查,将其设置为
Half

Graphics.TextRenderingHint
设置为
SingleBitPerPixelGridFit
我不确定这会有帮助,但是为什么不在没有函数调用的情况下创建字体呢

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

我用类似的功能构建了一些生成图像按钮的东西,但是我在字距调整和字体拉伸方面遇到了问题。下面的设置让我非常接近我想要的,但仍然不是100%

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

你用什么图形格式传输图像?格式是Png,因为背景是透明的。我目前正在尝试下面建议的所有内容。到目前为止,使用TextRenderer时没有任何变化。我回到图形。DrawString agian和结果会更好一些。当我得到正确的组合时,我会发布agian。酷,只是checking确保您没有尝试使用GIF,因为这样会丢失alpha通道,并产生类似的丑陋结果。这有助于简化,但仍然是一样的,无论如何,感谢我忽略了这一点。注意:我认为这对渲染质量没有帮助,但更简单的代码始终是a:D这是可行的,但仅适用于较大的字体(即20px),无论如何,我到目前为止做得最接近。我将尝试玩更多的游戏,看看我是否可以用较小的字体获得更好的效果。我尝试过,较大的字体会变得凌乱,而较小的字体也会获得高质量。
objGraphics2.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
objGraphics2.TextRenderingHint = System.Drawing.Drawing2D.TextRenderingHint.AntiAliasGridFit;