C # добавление строки к изображению, используя максимальный размер шрифта - PullRequest
2 голосов
/ 17 марта 2012

Я хочу добавить 2 строки к изображению следующим образом:

This is Text
------------
------------
------------
--Other-----

Как использовать максимально возможный размер шрифта, чтобы строка не выходила за пределы изображения?

пример: если текст слишком большой, он исчезает с картинки ::

This is Text That is too big
------------
------------
------------
--Other-----

Ответы [ 2 ]

3 голосов
/ 17 марта 2012

Я написал этот сценарий в моих предыдущих проектах, чтобы вписать текст в изображение, рассчитав его размеры для каждого размера шрифта.когда размер шрифта больше ширины изображения, он уменьшает размер шрифта на 0,1 мкм и повторяет попытку, пока текст не уместится на изображении.Вот код:

public static string drawTextOnMarker(string markerfile, string text, string newfilename,Color textColor)
    {
        //Uri uri = new Uri(markerfile, UriKind.Relative);
        //markerfile = uri.AbsolutePath;
        //uri = new Uri(newfilename, UriKind.Relative);
        //newfilename = uri.AbsolutePath;
        if (!System.IO.File.Exists(System.Web.HttpContext.Current.Server.MapPath(newfilename)))
        {
            try
            {

                Bitmap bmp = new Bitmap(System.Web.HttpContext.Current.Server.MapPath(markerfile));
                Graphics g = Graphics.FromImage(bmp);
                g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
                StringFormat strFormat = new StringFormat();
                strFormat.Alignment = StringAlignment.Center;
                SolidBrush myBrush = new SolidBrush(textColor);
                float fontsize = 10;
                bool sizeSetupCompleted = false;
                while (!sizeSetupCompleted)
                {                        
                    SizeF mySize = g.MeasureString(text, new Font("Verdana", fontsize, FontStyle.Bold));
                    if (mySize.Width > 24 || mySize.Height > 13)
                    {
                        fontsize-= float.Parse("0.1");
                    }
                    else
                    {
                        sizeSetupCompleted = true;
                    }
                }

                g.DrawString(text, new Font("Verdana", fontsize, FontStyle.Bold), myBrush, new RectangleF(4, 3, 24, 8), strFormat);
                bmp.Save(System.Web.HttpContext.Current.Server.MapPath(newfilename));
                return newfilename.Substring(2);
            }
            catch (Exception)
            {
                return markerfile.Substring(2);
            }
        }
        return newfilename.Substring(2);
    }
1 голос
/ 17 марта 2012

Вот быстрое решение:

using (Graphics g = Graphics.FromImage(bmp))
{
    float width = g.MeasureString(text, font).Width;
    float scale = bmp.Width / width;
    g.ScaleTransform(scale, scale); //Simple trick not to use other Font instance
    g.DrawString(text, font, Brushes.Black, PointF.Empty);
    g.ResetTransform();
    ...
}

Ваш текст не всегда будет иметь ширину 100%, если вы используете TextRenderingHint.AntiAliasGridFit или подобное, но я думаю, что это не проблема, так как вы просто хотите сделатьуверен, что текст alawys помещается на изображении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...