动态调整字体,而使用Graphics.DrawString以适应空间 [英] Dynamically resizing font to fit space while using Graphics.DrawString

查看:1506
本文介绍了动态调整字体,而使用Graphics.DrawString以适应空间的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有人有一个提示,而你可以动态调整大小的字体,以适应特定的区域?例如,我有一个800x110的矩形,我想有一个能够支持整个字符串我想显示最大尺寸字体填充它。

Does anyone have a tip whereas you could dynamically resize a font to fit a specific area? For example, I have an 800x110 rectangle and I want to fill it with the max size font that would support the entire string I'm trying to display.

Bitmap bitmap = new Bitmap(800, 110);

using (Graphics graphics = Graphics.FromImage(bitmap))
using (Font font1 = new Font("Arial", 120, FontStyle.Regular, GraphicsUnit.Pixel))
{
    Rectangle rect1 = new Rectangle(0, 0, 800, 110);

    StringFormat stringFormat = new StringFormat();
    stringFormat.Alignment = StringAlignment.Center;
    stringFormat.LineAlignment = StringAlignment.Center;

    graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
    graphics.DrawString("Billy Reallylonglastnameinstein", font1, Brushes.Red, rect1, stringFormat);
} 

bitmap.Save(Server.MapPath("~/Fonts/" + System.Guid.NewGuid() + ".png"));

显然,这整个的名字将不会呈现在大字体大小所提供的空间。必须有一个简单的方法来做到这一点?

Obviously that whole name won't render in the space provided at the large font size. There has to be a simple way to do this?

推荐答案

您应该做一个尺度变换 Font.Size 下面的函数是这样做的一个例子,但可以提高其应用效果更佳。

You should do a scale transform on Font.Size the following function is an example of doing that but you can improve it to apply better results.

下面是 FindFont 函数得到一个房间和一个文本prefered大小,给你一个字体中,你可以设置整个文本适合的房间!

Here is FindFont function which get a room and a text with prefered size and gives you a font in which you can set that whole text fits the room!

//This function checks the room size and your text and appropriate font for your text to fit in room
    //PreferedFont is the Font that you wish to apply
    //Room is your space in which your text should be in.
    //LongString is the string which it's bounds is more than room bounds.
    private Font FindFont(  System.Drawing.Graphics g , string longString , Size Room , Font PreferedFont)
    {
        //you should perform some scale functions!!!
        SizeF RealSize = g.MeasureString(longString, PreferedFont);
        float HeightScaleRatio = Room.Height / RealSize.Height;
        float WidthScaleRatio = Room.Width / RealSize.Width;
        float ScaleRatio = (HeightScaleRatio < WidthScaleRatio) ? ScaleRatio = HeightScaleRatio : ScaleRatio = WidthScaleRatio;
        float ScaleFontSize = PreferedFont.Size * ScaleRatio;
        return new Font(PreferedFont.FontFamily, ScaleFontSize);
    }

对于你的问题,你可以这样调用它下面的code:

for your question you can call it like the following code:

 Bitmap bitmap = new Bitmap(800, 110);

            using (System.Drawing.Graphics graphics = System.Drawing.Graphics.FromImage(bitmap))
            using (Font font1 = new Font("Arial", 120, FontStyle.Regular, GraphicsUnit.Pixel))
            {
                Rectangle rect1 = new Rectangle(0, 0, 800, 110);

                StringFormat stringFormat = new StringFormat();
                stringFormat.Alignment = StringAlignment.Center;
                stringFormat.LineAlignment = StringAlignment.Center;
                graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;

                Font goodFont = FindFont(graphics, "Billy Reallylonglastnameinstein" , rect1.Size, font1);
                graphics.DrawString("Billy Reallylonglastnameinstein", goodFont, Brushes.Red, rect1, stringFormat);
            }

这篇关于动态调整字体,而使用Graphics.DrawString以适应空间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆