如何使用TextMetrics测量字符串的尺寸

时间:2018-03-19 22:55:02

标签: c# .net

我试图获得字符串的高度。我遇到过MeasureString,但它对我所需要的东西不准确 - 对于MS Word显示的东西来说太小了(好吧,这可能是另一个话题,所以如果你能指出我正确的资源...... 。)

所以,我发现了TextMetrics。我想尝试一下,但我无法理解如何使用它。这是我的示例代码:

static public double MeasureGroup2()
    {
        TextMetrics txt = new TextMetrics();

        double height;

        height = txt.Height;

        return height;
    }

在哪里/如何设置字体和字体大小,以及为其返回我需要的值的字符串?

P.S。我的最终目标是测量字符串的高度,就像MS Word"测量"或渲染它。我对除了这两个以外的其他解决方案持开放态度。

其他信息:

MeasureString的代码:

 static public double MeasureGroup1(string TextFont, int FSize)
    {
        string Str = "Mgkfps";

        Bitmap Bmp = new Bitmap(99,99);
        Graphics DrawGraphics = Graphics.FromImage(Bmp);
        GraphicsUnit Unit = GraphicsUnit.Point;
        DrawGraphics.PageUnit = Unit;
        DrawGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
        StringFormat format = StringFormat.GenericTypographic;

        // Set up string.
        System.Drawing.Font stringFont = new System.Drawing.Font(TextFont, FSize, FontStyle.Regular, Unit);

        // Measure string.
        SizeF stringSize = new SizeF();
        stringSize = DrawGraphics.MeasureString(Str, stringFont, 99, format);

        DrawGraphics.Dispose();
        format.Dispose();
        stringFont.Dispose();


        return stringSize.Height;
        //return TextSize;
    }

注意: 使用Arial 11和Arial 12,此代码的输出需要乘以1.0294,与MS Word的显示方式相同。使用Word的标尺,Photoshop和大量的比例和比例进行物理测量。 (也许这就是问题?)

static public double MeasureGroup2(string TextFont, int FSize)
    {
        string Str = "Mgkfps";
        double height;

        Bitmap Bmp = new Bitmap(99, 99);
        Graphics DrawGraphics = Graphics.FromImage(Bmp);

        GraphicsUnit Unit = GraphicsUnit.Point;
        DrawGraphics.PageUnit = Unit;
        DrawGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
        StringFormat format = StringFormat.GenericTypographic;

        // Set up string.
        System.Drawing.Font stringFont = new System.Drawing.Font(TextFont, FSize, FontStyle.Regular, Unit);

        Rectangle Rect = new Rectangle(0, 0, 99, 99);

        Size sz = new Size(99,99);
        sz = TextRenderer.MeasureText(DrawGraphics, Str, stringFont, sz ,TextFormatFlags.NoPadding);

        height = sz.Height;

        return height;
    }

1 个答案:

答案 0 :(得分:0)

首先,谢谢大家帮助我!

使用TextMetrics获取文本的尺寸时,请在此处参阅此文章: https://www.cyotek.com/blog/retrieving-font-and-text-metrics-using-csharp

他在页面底部有一个示例项目。

至于我希望使用它的位置,这是获得MS Word中文本的高度:

我假设文本高度和行间距设置为单一时是相同的。不是这种情况。有一小部分空间,即领先,不是由MeasureString测量的。这就是为什么我希望使用GetTextMetrics函数,因为它返回一个包含前导的结构。无论如何,它似乎用于其他东西。

幸运的是,显然,.NET框架有一个原生方法可以返回我需要的值,即FontFamily.GetLineSpacing。

LineHeight = stringFont.Size * FF.GetLineSpacing(FontStyle.Regular)/FF.GetEmHeight(FontStyle.Regular);

参考:

https://answers.microsoft.com/en-us/office/forum/office_2013_release-word/what-reasons-make-different-line-spacing-between/ca1267f9-0cfe-4f26-8048-bbd7a6a46398?auth=1

https://docs.microsoft.com/en-us/dotnet/framework/winforms/advanced/how-to-obtain-font-metrics