我知道这是一个非常主观的问题,但由于WPF中的文本呈现仍然是一个问题,我必须充分利用它.
在WPF应用程序中,文本往往变得模糊,这不是什么秘密.还有关于这个主题的无数网站以及你如何解决这个问题.但我想知道......文字模糊似乎比其他人更多地影响某些字体.所以我仍然在寻找最好的字体来解决这个问题.
到目前为止,我仍在使用Arial,看起来不太好.但我相信其他一些字体更适合手头的任务.
如果我使用OnPaintBackground中提供的Graphics对象使用TextRenderer.DrawText(),我的文本看起来很完美.如果我创建自己的Bitmap并使用从我的Bitmap获得的Graphics对象,我的文本看起来很糟糕.看起来它使用黑色对文本进行抗锯齿处理,而不是位图的背景颜色.如果我使用Graphics.DrawString(),我可以避免这个问题,但这种方法有可怕的字距调整问题.我该怎么办?如何使用Bitmap的内容正确地将TextRenderer.DrawText()转换为反别名?
看起来很糟糕:
Bitmap bmp = new Bitmap(100, 100, PixelFormat.Format32bppArgb);
using (Graphics g = Graphics.FromImage(bmp))
{
g.Clear(Color.Red);
TextFormatFlags tf = TextFormatFlags.Left;
TextRenderer.DrawText(g, @"C:\Development\Testing\blag", font, clip, Color.White, Color.Transparent, tf);
}
Run Code Online (Sandbox Code Playgroud)
看起来不错,但我想将其渲染到位图上,而不是渲染到控件的表面上:
protected override void OnPaintBackground(PaintEventArgs e)
{
e.Graphics.Clear(Color.Red);
TextFormatFlags tf = TextFormatFlags.Left;
TextRenderer.DrawText(e.Graphics, @"C:\Development\Testing\blag", font, clip, Color.White, Color.Transparent, tf);
}
Run Code Online (Sandbox Code Playgroud)
有什么不同?
我有一个ac#应用程序,它可以进行文本渲染,与简单的所见即所得文本编辑器相同.
我正在使用TextRenderer.DrawText将文本呈现到屏幕上,使用GetTextExtentPoint32来测量文本,这样我就可以在同一行上定位不同的字体样式/大小.
在Vista这一切都很好.然而,在XP中,Arial渲染方式不同,某些字符(如"o"和"b")占用的宽度比Vista中的宽.GetTextExtentPoint32似乎是在Vista中测量字符串,但宽度较小.最终结果是,每隔一段时间就会出现一段文本与之前的文本重叠,因为前面的文本被测量为小于它在屏幕上的实际值.
此外,我的文本渲染代码模仿即正确的文本渲染(仅用于简单格式和英文),即文本渲染似乎在vista和xp之间保持一致 - 这就是我注意到不同字符大小的变化.
有什么想法发生了什么?
简而言之,TextRenderer.DrawText和GetTextExtentPoint32在xp中与Arial不匹配.DrawText似乎绘制了比Vista中更大和/或更小的某些字符,但GetTextExtentPoint32似乎是在Vista中测量文本(它似乎与文本渲染相匹配,即在xp和vista上).希望有道理.
注意:遗憾的是TextRenderer.MeasureString不够快或不够准确,无法满足我的要求.我尝试使用它,不得不把它撕掉.
我正在尝试在位图图像上绘制文本,我做了一些研究,发现.NET/GDI +不支持OTF字体.我在某处读到了你可以用TextRenderer.DrawTextGDI渲染OTF字体的地方,但我似乎无法弄清楚如何,质量也没有比较Graphics.DrawString.
首先,是否可以在VS中使用OTF字体或者我是否错误地阅读了某些内容?
其次,如果答案是TextRenderer.DrawText,我该如何使用OTF字体?看起来我必须使用System.Drawing.Font该类,但我不认为那些支持字体,这是问题,对吗?
如何使用GDI +(Graphics.DrawString)使字体像TTF字体一样清晰地呈现
使用Graphics.DrawString我能够使用RectangleF(具有指定的宽度,0高度)作为我的文本的边界,并正确包装文本.随着TextRenderer.DrawText,使用的能力RectangleF消失,只允许Rectangle哪些似乎不允许0高度,同时仍然允许文本显示(即文本必须在矩形内,文本包装不起作用).我做错了吗?
任何帮助将不胜感激.如果无法做到这一点,有没有办法转换OTF字体,或在TTF版本中在线找到Gotham字体系列?我真的需要这些字体!
我想在给定一定宽度的可用画布的情况下测量文本的高度.我传入的文本很长,我知道会包装.为此,我呼吁以下内容:
using System.Windows.Forms;
...
string text = "Really really long text that is sure to wrap...";
Font font = new Font("Arial", 14);
Size canvas = new Size(1100, 850);
Size size = TextRenderer.MeasureText(text, font, canvas);
Run Code Online (Sandbox Code Playgroud)
无论我为画布传递什么,它总是返回14 size.Height.
我错过了一些简单的事吗?
调用TextRenderer.MeasureText如下:
TextRenderer.MeasureText(myControl.Text, myControl.Font);
Run Code Online (Sandbox Code Playgroud)
并将结果与控件的大小进行比较,以检查文本是否适合.结果有时是不正确的.观察了以下两个问题:
有没有办法提高MeasureText方法的准确性?我应该调用接受设备上下文和/或格式标志的覆盖之一吗?
一切都在标题中.我尝试创建自己的OpenGL字体系统,我需要获得我想要包含在Sprite纹理中的每个字符的大小.除了字符"&"(ascii 38)之外,所有这些都能很好地准确地工作.即使我更改了字体,该字符的宽度也始终为零.身高很好.
最奇怪的是,如果我尝试测量"&&"(Chr(38)&Chr(38))的连接,结果似乎很好!我没有检查相同的代码是否在同一字体产品的另一个范围内相同的错误,所以我不知道是否解决方法"如果char是"38"测试"38 + 38"的大小将总是工作.
编辑:对不起,我真傻.我完全忘了说我在VB.Net下(但可以理解C#)并且我使用OpenGL和OpenTK进行绑定.TextRenderer是一类GDi +.我用它来创建我的字体纹理.这实际上不是OpenGL问题.
textrenderer ×7
c# ×4
.net ×2
gdi+ ×2
winforms ×2
.net-4.0 ×1
drawstring ×1
drawtext ×1
graphics ×1
text ×1
vb.net ×1
windows-xp ×1
wpf ×1