gpt4 book ai didi

c# - ASP.NET TextRenderer.DrawText 糟糕的文本图像

转载 作者:太空狗 更新时间:2023-10-29 20:21:34 24 4
gpt4 key购买 nike

因为我已经尝试使用 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

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

最佳答案

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

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

关于c# - ASP.NET TextRenderer.DrawText 糟糕的文本图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9038125/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com