C#将字符串添加到图像中,使用最大字体大小
本文关键字:字体 字符串 添加 图像 | 更新日期: 2023-09-27 18:28:02
我想向图像添加2个字符串,如下所示:
This is Text
------------
------------
------------
--Other-----
如何使用尽可能大的字体而不让字符串偏离图像的一侧?
示例:如果文本太大,则它会从图像中消失::
This is Text That is too big
------------
------------
------------
--Other-----
我在以前的项目中编写了这个脚本,通过计算每个字体大小的尺寸来将一些文本放入图像中。当字体大小大于图像的宽度时,它会将字体大小降低0.1em,然后重试,直到文本适合图像。这是代码:
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);
}
这里有一个快速解决方案:
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();
...
}
如果你使用TextRenderingHint.AntiAliasGridFit
或类似的东西,你的文本不会总是100%的宽度,但我认为这不是问题,因为你只想确保文本在图像中合适。